Вопрос разбора Python XML

1

У меня есть 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)

может кто-нибудь сказать мне, что я делаю неправильно?

Спасибо

Теги:
xml-parsing

2 ответа

0
Лучший ответ

Ваш zombie является элементом <row>, а не элементом <field>, который вы хотите. Когда вы вызываете get() на нем, вы пытаетесь получить атрибут в элементе <row>, но вы хотите, чтобы это значение node элемента <field> с этим идентификатором.

Если у вас есть Python 2.7, вы можете использовать поддержку ElementTree partial XPath для поиска правильного элемента:

build_id = zombie.find('field[name="buildid"]').text
  • 0
    Хорошо, так как я могу получить значение внутри тега поля? Должен ли я проверить свойство name тега field для всех данных, которые я хочу?
  • 0
    большое спасибо Стив
0

Вы должны получить свойство text для зомби, не используя его метод get(). Это даст вам содержимое внутри тега <field>.

Кроме того, если вы используете ElementTree, посмотрите модуль lxml, который обычно лучше ET, и полностью поддерживает XPath 1.0 (которые вы можете легко использовать для поиска элементов по их имени).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню