Python的XML解析问题
问题描述:
我有一个XML文件,它看起来像这样:Python的XML解析问题
<!DOCTYPE ROOT SYSTEM "zombie.dtd">
<ROOT>
<row>
<field name="buildid">26960</field>
<field name="cast(status as char)">Filesystem 1K-blocks Used Available Use% Mounted on
C:cygwinin 285217976 88055920 197162056 31% /usr/bin
C:cygwinlib 285217976 88055920 197162056 31% /usr/lib
C:cygwin 285217976 88055920 197162056 31%/
c: 285217976 88055920 197162056 31% /cygdrive/c
d: 285217976 88055920 197162056 31% /cygdrive/d</field>
<field name="eventtime">2011-05-25 16:26:09</field>
<field name="schedulerid">13</field>
</row>
,我试图分析出各个字段(buildid,状态,EVENTTIME等),但我由于我所有的函数调用没有得到,这里是我在做什么:
log("Parsing XML file...")
try:
xml = ET.parse(xml_file)
except Exception, inst:
print "Unexpected error opening %s: %s" % (file, inst)
sys.exit(1)
log("Parsing Complete")
#store the root of the element tree
root = xml.getroot()
zombies = []
for zombie in root.findall('row/'):
#read the zombie data
buildID = zombie.get('buildid')
print buildID
status = zombie.get('cast(status as char')
print status
eventTime = zombie.get('eventtime')
print eventTime
schedulerID = zombie.get('schedulerid')
print schedulerID
#create a zombie object
#z = Zombie(buildID, status, eventTime, schedulerID)
#zombies.append(z)
有人可以告诉我我做错了什么吗?
感谢
答
您的zombie
是一个<row>
元素,而不是您想要的<field>
元素。当你打电话给get()
时,你试图在<row>
元素上获得一个属性,但是你想要的是具有该id的<field>
元素的节点值。
如果你有Python 2.7版,您可以使用ElementTree中的部分XPath的支持,以找到正确的元素:
build_id = zombie.find('field[name="buildid"]').text
答
你应该得到的僵尸text
属性,而不是使用其get()
方法。这会为您提供标签内的内容。另外,如果您使用的是ElementTree,请查看lxml
模块,该模块通常比ET更好,并且完全支持XPath 1.0表达式(您可以使用它们轻松地按名称查找元素)。
好了,所以我怎么领域标签内的价值?我是否需要为所需的所有数据测试字段标记的名称属性? – 2011-06-13 17:16:12
非常感谢史蒂夫 – 2011-06-13 18:34:05