У меня есть 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)
может кто-нибудь сказать мне, что я делаю неправильно?
Спасибо
Ваш zombie
является элементом <row>
, а не элементом <field>
, который вы хотите. Когда вы вызываете get()
на нем, вы пытаетесь получить атрибут в элементе <row>
, но вы хотите, чтобы это значение node элемента <field>
с этим идентификатором.
Если у вас есть Python 2.7, вы можете использовать поддержку ElementTree partial XPath для поиска правильного элемента:
build_id = zombie.find('field[name="buildid"]').text
Вы должны получить свойство text
для зомби, не используя его метод get()
. Это даст вам содержимое внутри тега <field>
.
Кроме того, если вы используете ElementTree, посмотрите модуль lxml
, который обычно лучше ET, и полностью поддерживает XPath 1.0 (которые вы можете легко использовать для поиска элементов по их имени).