【发布时间】:2010-12-19 16:17:15
【问题描述】:
我很难找到一个好的基本示例,说明如何使用元素树在 python 中解析 XML。据我所知,这似乎是用于解析 XML 的最简单的库。这是我正在使用的 XML 示例:
<timeSeriesResponse>
<queryInfo>
<locationParam>01474500</locationParam>
<variableParam>99988</variableParam>
<timeParam>
<beginDateTime>2009-09-24T15:15:55.271</beginDateTime>
<endDateTime>2009-11-23T15:15:55.271</endDateTime>
</timeParam>
</queryInfo>
<timeSeries name="NWIS Time Series Instantaneous Values">
<values count="2876">
<value dateTime="2009-09-24T15:30:00.000-04:00" qualifiers="P">550</value>
<value dateTime="2009-09-24T16:00:00.000-04:00" qualifiers="P">419</value>
<value dateTime="2009-09-24T16:30:00.000-04:00" qualifiers="P">370</value>
.....
</values>
</timeSeries>
</timeSeriesResponse>
我能够使用硬编码的方法做我需要的事情。但我需要我的代码更有活力。这是有效的:
tree = ET.parse(sample.xml)
doc = tree.getroot()
timeseries = doc[1]
values = timeseries[2]
print child.attrib['dateTime'], child.text
#prints 2009-09-24T15:30:00.000-04:00, 550
这是我尝试过的几件事,但都没有奏效,报告说他们找不到 timeSeries(或我尝试过的任何其他东西):
tree = ET.parse(sample.xml)
tree.find('timeSeries')
tree = ET.parse(sample.xml)
doc = tree.getroot()
doc.find('timeSeries')
基本上,我想加载xml文件,搜索timeSeries标签,遍历value标签,返回dateTime和标签本身的值;我在上面的例子中所做的一切,但没有对我感兴趣的 xml 部分进行硬编码。谁能给我一些例子,或者给我一些关于如何解决这个问题的建议?
感谢所有帮助。使用以下两个建议都适用于我提供的示例文件,但是,它们不适用于完整文件。这是我在使用 Ed Carrel 的方法时从真实文件中得到的错误:
(<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)
我认为它不喜欢真实文件中的某些内容,因此我逐步删除了某些内容,直到它起作用为止。以下是我更改的行:
originally: <timeSeriesResponse xsi:schemaLocation="a URL I removed" xmlns="a URL I removed" xmlns:xsi="a URL I removed">
changed to: <timeSeriesResponse>
originally: <sourceInfo xsi:type="SiteInfoType">
changed to: <sourceInfo>
originally: <geogLocation xsi:type="LatLonPointType" srs="EPSG:4326">
changed to: <geogLocation>
删除具有 'xsi:...' 的属性解决了这个问题。 'xsi:...' 不是有效的 XML 吗?我很难以编程方式删除这些。有什么建议的解决方法吗?
这是完整的 XML 文件:http://www.sendspace.com/file/lofcpt
当我最初问这个问题时,我不知道 XML 中的名称空间。现在我知道发生了什么,我不必删除作为命名空间声明的“xsi”属性。我只是将它们包含在我的 xpath 搜索中。有关 lxml 中命名空间的更多信息,请参阅 this page。
【问题讨论】:
-
我可以建议您查看
lxml提供的etree模块吗?我最近发现了它,并发现它比 ElementTree 优越得多。它是作为完全模拟 ElementTree 的替代品编写的。 -
我最终选择了 lxml,因为它更容易使用,但我仍然遇到上述问题。作为解决方法,我事先扫描 xml 文件并删除所有“xsi:type”实例。以下答案中概述的方法可以正常工作。
标签: python xml elementtree