2017-02-28 15 views
0

私はライブラリのドキュメントからXMLレスポンスを解析しようとしていますが、必要な値を見つける簡単な方法を判断できません。共通のライブラリを使用します。私は出力を切り捨ててきたし、私が欲しい二つの値がテキスト値ですXML解析のヘルプPython lxml、etree、dom

<entry 
     xmlns="http://www.w3.org/2005/Atom" 
     xmlns:s="http://dev.splunk.com/ns/rest" 
     xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"> 
    <title>search index</title> 
    <id>https://localhost:8089/services/search/jobs/mysearch_02151949</id> 
    <updated>2011-07-07T20:49:58.000-07:00</updated> 
    <link href="/services/search/jobs/mysearch_02151949" rel="alternate"/> 
    <published>2011-07-07T20:49:57.000-07:00</published> 
    <link href="/services/search/jobs/mysearch_02151949/search.log" rel="search.log"/> 
    <link href="/services/search/jobs/mysearch_02151949/events" rel="events"/> 
    <link href="/services/search/jobs/mysearch_02151949/results" rel="results"/> 
    <link href="/services/search/jobs/mysearch_02151949/results_preview" rel="results_preview"/> 
    <link href="/services/search/jobs/mysearch_02151949/timeline" rel="timeline"/> 
    <link href="/services/search/jobs/mysearch_02151949/summary" rel="summary"/> 
    <link href="/services/search/jobs/mysearch_02151949/control" rel="control"/> 
    <author> 
    <name>admin</name> 
    </author> 
    <content type="text/xml"> 
    <s:dict> 
     <s:key name="cursorTime">1969-12-31T16:00:00.000-08:00</s:key> 
     <s:key name="delegate"></s:key> 
     <s:key name="diskUsage">2174976</s:key> 
     <s:key name="dispatchState">DONE</s:key> 
     <s:key name="doneProgress">1.00000</s:key> 
     <s:key name="dropCount">0</s:key> 
     <s:key name="earliestTime">2011-07-07T11:18:08.000-07:00</s:key> 
     <s:key name="eventAvailableCount">287</s:key> 
     <s:key name="eventCount">287</s:key> 
     <s:key name="eventFieldCount">6</s:key> 
     <s:key name="eventIsStreaming">1</s:key> 
     <s:key name="eventIsTruncated">0</s:key> 
     <s:key name="eventSearch">search index</s:key> 
     <s:key name="eventSorting">desc</s:key> 
     <s:key name="isDone">1</s:key> 

:文字列フォーマットである

サンプルXML応答

  • 名=「isDone」( 1)
  • 名= "doneProgress"(1.00000)
  • 名= "EVENTCOUNT"(287)

これらの数値はどのようにして見つけられますか?

+0

beautifulsoup4を見ましたか?私はそれに幸運をもたらしました。例:http://stackoverflow.com/questions/4071696/python-beautifulsoup-xml-parsing#4093940 –

+0

私はBS4の大ファンです。私は、XMLネイティブのSplunkと統合しているので、実際のXMLライブラリがその作業をしたかっただけです。 – DJimmy

答えて

0

あなたはlxmlxpathを使用することができます。

[1]を出力します
ns = {'s':"http://dev.splunk.com/ns/rest"} 
print xml.xpath("//s:key[@name='isDone']/text()", namespaces=ns) 

。完全な例:

xml = ''' 
<entry 
     xmlns="http://www.w3.org/2005/Atom" 
     xmlns:s="http://dev.splunk.com/ns/rest" 
     xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"> 
    <title>search index</title> 
    <id>https://localhost:8089/services/search/jobs/mysearch_02151949</id> 
    <updated>2011-07-07T20:49:58.000-07:00</updated> 
    <link href="/services/search/jobs/mysearch_02151949" rel="alternate"/> 
    <published>2011-07-07T20:49:57.000-07:00</published> 
    <link href="/services/search/jobs/mysearch_02151949/search.log" rel="search.log"/> 
    <link href="/services/search/jobs/mysearch_02151949/events" rel="events"/> 
    <link href="/services/search/jobs/mysearch_02151949/results" rel="results"/> 
    <link href="/services/search/jobs/mysearch_02151949/results_preview" rel="results_preview"/> 
    <link href="/services/search/jobs/mysearch_02151949/timeline" rel="timeline"/> 
    <link href="/services/search/jobs/mysearch_02151949/summary" rel="summary"/> 
    <link href="/services/search/jobs/mysearch_02151949/control" rel="control"/> 
    <author> 
    <name>admin</name> 
    </author> 
    <content type="text/xml"> 
    <s:dict> 
     <s:key name="cursorTime">1969-12-31T16:00:00.000-08:00</s:key> 
     <s:key name="delegate"></s:key> 
     <s:key name="diskUsage">2174976</s:key> 
     <s:key name="dispatchState">DONE</s:key> 
     <s:key name="doneProgress">1.00000</s:key> 
     <s:key name="dropCount">0</s:key> 
     <s:key name="earliestTime">2011-07-07T11:18:08.000-07:00</s:key> 
     <s:key name="eventAvailableCount">287</s:key> 
     <s:key name="eventCount">287</s:key> 
     <s:key name="eventFieldCount">6</s:key> 
     <s:key name="eventIsStreaming">1</s:key> 
     <s:key name="eventIsTruncated">0</s:key> 
     <s:key name="eventSearch">search index</s:key> 
     <s:key name="eventSorting">desc</s:key> 
     <s:key name="isDone">1</s:key> 
    </s:dict> 
    </content> 
</entry> 
''' 

from lxml import etree 
from cStringIO import StringIO 

xml = StringIO(xml) 
xml = etree.parse(xml) 
ns = {'s':"http://dev.splunk.com/ns/rest"} 
print xml.xpath("//s:key[@name='isDone']/text()", namespaces=ns) 
+0

私の元には、文字列形式で既にあるので、私はcStringIO輸入StringIO' 'XML =にStringIO(XML)私はこの使用して試した' から ' を省略することができるよ: ' XML = etree.fromstring(XMLを)「xml.xpath( "// s:key [@ name = 'isDone']/'xxx.xpath' "Element"オブジェクトには属性xpathがありません – DJimmy

+0

実際には、それは機能しました。私のAttributeErrorの問題は無関係でした。 – DJimmy