首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ElementTree在Python语言中解析XML示例

使用ElementTree在Python语言中解析XML示例
EN

Stack Overflow用户
提问于 2009-11-24 06:24:01
回答 2查看 158.5K关注 0票数 64

我很难找到一个很好的、基本的例子来说明如何使用元素树在python中解析XML。据我所知,这似乎是用于解析XML的最简单的库。下面是我正在使用的XML示例:

代码语言:javascript
复制
<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>

我可以使用硬编码的方法来做我需要的事情。但我需要我的代码更具动态性。以下是有效的方法:

代码语言:javascript
复制
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 (或者我尝试过的任何其他方法):

代码语言:javascript
复制
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的方法时从实际文件中得到的错误:

代码语言:javascript
复制
 (<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)

我认为在真正的文件中有一些它不喜欢的东西,所以我逐渐删除了一些东西,直到它正常工作。以下是我更改的代码行:

代码语言:javascript
复制
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搜索中。有关this page中的名称空间的更多信息,请参见lxml。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-24 06:42:35

所以我现在在我的机器上安装了ElementTree 1.2.6,并对您发布的XML块运行了以下代码:

代码语言:javascript
复制
import elementtree.ElementTree as ET

tree = ET.parse("test.xml")
doc = tree.getroot()
thingy = doc.find('timeSeries')

print thingy.attrib

并得到了以下信息:

代码语言:javascript
复制
{'name': 'NWIS Time Series Instantaneous Values'}

它似乎已经找到了timeSeries元素,而不需要使用数字索引。

现在有用的是知道你说“它不工作”是什么意思。由于它在给定相同输入的情况下对我有效,因此ElementTree不太可能以某种明显的方式被破坏。使用任何错误消息、回溯或任何可以帮助我们帮助您的内容来更新您的问题。

票数 46
EN

Stack Overflow用户

发布于 2009-11-24 07:27:32

如果我没理解错你的问题:

代码语言:javascript
复制
for elem in doc.findall('timeSeries/values/value'):
    print elem.get('dateTime'), elem.text

或者,如果您愿意(如果timeSeries/values只出现一次

代码语言:javascript
复制
values = doc.find('timeSeries/values')
for value in values:
    print value.get('dateTime'), elem.text

findall()方法返回所有匹配元素的列表,而find()只返回第一个匹配元素。第一个示例循环遍历所有找到的元素,第二个循环遍历values元素的子元素,在本例中产生相同的结果。

然而,我不明白找不到timeSeries的问题来自哪里。也许你只是忘记了getroot()调用?(请注意,您并不真正需要它,因为如果您将路径表达式更改为例如/timeSeriesResponse/timeSeries/values//timeSeries/values,您也可以从elementtree本身开始工作)

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1786476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档