2015-05-14 4 views
1

Я пытаюсь написать скрипт Python, который печатает значение определенного тега в выходе XML. Здесь значение тега, которое мне нужно распечатать, - это значение в каждом вхождении в выходе XML. Я попытался, как показано ниже, но он показывает ошибку атрибута. Что здесь может быть не так? Каков правильный способ получения и печати значений некоторых других тегов, которые мне интересны? Любая помощь, пожалуйста? Благодарю.print tag value from xml using python

import xml.etree.ElementTree as ET 

mystring="""<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <student> 
     <male> 
      <result>pass</result> 
      <name>Paul</name> 
      <address>boston</address> 
      <localreference> 
       <name>Charlie</name> 
      </localreference> 
     </male> 
     <female> 
      <result>pass</result> 
      <name>Rose</name> 
      <address>newyork</address> 
      <localreference> 
       <name>Charlie</name> 
      </localreference> 
     </female> 
    </student> 
    <student> 
     <male> 
      <result>fail</result> 
      <name>Philippe</name> 
      <address>boston</address> 
      <localreference> 
       <name>White</name> 
      </localreference> 
     </male> 
    </student> 
</main>""" 

main = ET.fromstring(mystring) 
for student in main: 
    if (student.tag == "student"): 
     print student.find("male/result").text 
     print student.find("female/result").text 

Ошибка>

# python new5.py 
pass 
pass 
fail 
Traceback (most recent call last): 
    File "new5.py", line 39, in <module> 
    print student.find("female/result").text 
AttributeError: 'NoneType' object has no attribute 'text' 

ответ

0

ElementTree поддерживает подмножество XPath, и что может быть проще для вашего примера:

root = ET.fromstring(mystring) 
for gender in ('male', 'female'): 
    print gender 
    for student in root.findall('./student/%s' % gender): 
     print '\t{:20}: {}'.format(student.find('name').text, student.find('result').text) 

распечаток:

male 
    Paul    : pass 
    Philippe   : fail 
female 
    Rose    : pass 

(кстати: избегать использования main в качестве имени переменной, так как вы затирать наименование модуля main)


Если вы хотите, чтобы результаты в документе порядка, а не сгруппированы по признаку пола, вы могли бы сделать что-то вроде:

for students in root.findall('./student'): 
    for gender in students: 
     print ' '.join([gender.tag] + map(lambda a: gender.find(a).text, ('name', 'address', 'result', 'localreference/name'))) 

гравюр

male Paul boston pass Charlie 
female Rose newyork pass Charlie 
male Philippe boston fail White 
+0

Благодаря Dawg. Однако я получаю эту ошибку. # python new5.py мужчина Traceback (последний звонок последний): Файл "new5.py", строка 40, в print '\ t {: 20}: {}'. format (student.find (' name '). text, student.find (' result '). text) ValueError: имя поля нулевой длины в формате – user3721640

+0

Какая версия os Python? У вас, вероятно, есть Python 2.6. Используйте '' \ t {0:20}: {1} ''для строки формата. – dawg

+0

Удивительно, что сработало. Я использую 2.6.6. Извините, что я начинаю здесь, не могли бы вы объяснить последнее заявление печати? print '\ t {: 20}: {}'. format (student.find ('name'). text, student.find ('result'). text) Спасибо Dawg .. – user3721640

0

Код для печати значения тега является правильным, но вы просите о разделе вашего XML, который не существует. Во второй секции ученика нет женского отделения. Вот почему student.find("female/result") возвращает None на второго ученика, и вы не можете позвонить по номеру .text по объекту None.