Python XML解析问题

时间:2011-06-13 16:52:59

标签: python xml xml-parsing

我有一个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,status,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)

有人可以告诉我我做错了什么吗?

由于

2 个答案:

答案 0 :(得分:0)

您应该获得僵尸的text属性,而不是使用其get()方法。这将为您提供de <field>标记内的内容。

另外,如果您正在使用ElementTree,请查看lxml模块,该模块通常比ET更好,并且完全支持XPath 1.0表达式(您可以使用它们轻松找到元素他们的名字。)

答案 1 :(得分:0)

您的zombie<row>元素,而不是您想要的<field>元素。当您在其上调用get()时,您尝试获取<row>元素的属性,但您想要的是具有该ID的<field>元素的节点值。

如果你有Python 2.7,你可以使用ElementTree的部分XPath支持来找到正确的元素:

build_id = zombie.find('field[name="buildid"]').text