我有一个很难找到一个很好的,如何使用元树蟒解析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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top