Python的XML解析问题

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 
+0

好了,所以我怎么领域标签内的价值?我是否需要为所需的所有数据测试字段标记的名称属性? – 2011-06-13 17:16:12

+0

非常感谢史蒂夫 – 2011-06-13 18:34:05

你应该得到的僵尸text属性,而不是使用其get()方法。这会为您提供标签内的内容。另外,如果您使用的是ElementTree,请查看lxml模块,该模块通常比ET更好,并且完全支持XPath 1.0表达式(您可以使用它们轻松地按名称查找元素)。