在Python解析XML使用ElementTree的例子
-
21-09-2019 - |
题
我有一个很难找到一个很好的,如何使用元树蟒解析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
下面是我试了几件事情,他们没有工作,报告说,他们无法找到时间序列(或其他任何东西我试过):
tree = ET.parse(sample.xml)
tree.find('timeSeries')
tree = ET.parse(sample.xml)
doc = tree.getroot()
doc.find('timeSeries')
基本上,我要加载的xml文件,搜索时间序列标签,并通过迭代数值标签,返回日期时间和标签本身的值;一切我做在上面的例子,但不硬编码的我我感兴趣的任何人都可以点一些例子XML的部分,或者给我如何工作的一些建议,通过这个?
感谢所有帮助。然而,使用两者的下方上我公司提供的样本文件工作的建议,他们没有工作,对完整的文件。下面是我从真实文件得到的,当我用埃德卡雷尔氏法的错误:
(<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)
我想有什么东西在它没有像真正的文件,所以我incremently去掉的东西,直到它的工作。下面是我改变了行:
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命名空间的更多信息。
解决方案
所以我有ElementTree的1.2.6对我的盒子,现在,跑了反对您发布的XML块下面的代码:
import elementtree.ElementTree as ET
tree = ET.parse("test.xml")
doc = tree.getroot()
thingy = doc.find('timeSeries')
print thingy.attrib
和得到了以下回:
{'name': 'NWIS Time Series Instantaneous Values'}
它似乎已发现了时间序列元件而无需使用数值指标。
现在将是有益的什么是知道时,你说你是什么意思“这是行不通的。”因为它为我的作品给予相同的输入,这是不可能的ElementTree的是一些明显的方式打破。任何错误信息,回溯更新您的问题,或任何你能提供帮助我们帮助你。
其他提示
如果我正确地理解你的问题:
for elem in doc.findall('timeSeries/values/value'):
print elem.get('dateTime'), elem.text
或者如果你喜欢(并且如果存在timeSeries/values
只有一个发生:
values = doc.find('timeSeries/values')
for value in values:
print value.get('dateTime'), elem.text
在findall()
方法返回所有匹配元素的列表,而find()
只返回第一匹配元件。第一个例子的环在所有找到的元素,比values
元素的子元素的第二循环,在这种情况下,导致相同的结果。
我看不出有没有找到timeSeries
问题来源于但是。也许你只是忘记了getroot()
电话吗? (注意,你并不真的需要它,因为你可以从ElementTree的工作本身也一样,如果你改变了路径表达式例如/timeSeriesResponse/timeSeries/values
或//timeSeries/values
)