XML解析帮助Python lxml、etree或dom

XML解析帮助Python lxml、etree或dom,python,xml,lxml,elementtree,Python,Xml,Lxml,Elementtree,我一直在尝试解析库文档中的XML响应,但无法确定找到所需值的简单方法。我会使用任何公共图书馆 字符串格式的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

我一直在尝试解析库文档中的XML响应,但无法确定找到所需值的简单方法。我会使用任何公共图书馆

字符串格式的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>

搜索索引
https://localhost:8089/services/search/jobs/mysearch_02151949
2011-07-07T20:49:58.000-07:00
2011-07-07T20:49:57.000-07:00
管理
1969-12-31T16:00:00.000-08:00
2174976
完成
1
0
2011-07-07T11:18:08.000-07:00
287
287
6.
1.
0
搜索索引
描述
1.
我已经截断了输出,我想要的两个值是以下的文本值:

  • name=“isDone”(1)
  • name=“doneProgress”(1.00000)
  • name=“eventCount”(287)

如何查找这些数值?

您可以使用
lxml
xpath

ns = {'s':"http://dev.splunk.com/ns/rest"}
print xml.xpath("//s:key[@name='isDone']/text()", namespaces=ns)
它将打印
[1]
。完整示例:

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)
xml=''
搜索索引
https://localhost:8089/services/search/jobs/mysearch_02151949
2011-07-07T20:49:58.000-07:00
2011-07-07T20:49:57.000-07:00
管理
1969-12-31T16:00:00.000-08:00
2174976
完成
1
0
2011-07-07T11:18:08.000-07:00
287
287
6.
1.
0
搜索索引
描述
1.
'''
从lxml导入etree
从cStringIO导入StringIO
xml=StringIO(xml)
xml=etree.parse(xml)
ns={s':“http://dev.splunk.com/ns/rest"}
打印xml.xpath(“//s:key[@name='isDone']/text()”,名称空间=ns)

您看过beautifulsoup4吗?我运气不错。例如:我是BS4的超级粉丝。我只是想要一个实际的XML库来做这项工作,因为它与XML-native的Splunk集成。我的源代码已经是字符串格式,所以我可以从cStringIO导入StringIO中省略
XML=StringIO(XML)
我尝试过使用它:
XML=etree.fromstring(XML)
ns={'s':"http://dev.splunk.com/ns/rest“}
打印xml.xpath(“//s:key[@name='isDone']/text()”,namespaces=ns)
但是现在我得到了AttributeError:'Element'对象没有属性xpath实际上,它起作用了。我的AttributeError问题与此无关。