使用python从xml打印标记值

使用python从xml打印标记值,python,xml,elementtree,Python,Xml,Elementtree,我试图编写一个Python脚本,在XML输出中打印特定标记的值。这里,我需要打印的标记值是XML输出中每次出现的值。我尝试如下,但它显示了一个属性错误。这里可能出了什么问题?哪一种是获取和打印我感兴趣的某些标签值的正确方法?需要帮忙吗?谢谢 import xml.etree.ElementTree as ET mystring="""<?xml version="1.0" encoding="UTF-8"?> <main> <student>

我试图编写一个Python脚本,在XML输出中打印特定标记的值。这里,我需要打印的标记值是XML输出中每次出现的值。我尝试如下,但它显示了一个属性错误。这里可能出了什么问题?哪一种是获取和打印我感兴趣的某些标签值的正确方法?需要帮忙吗?谢谢

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'

用于打印标记值的代码是正确的,但您要求的是xml中不存在的部分。第二个学生区没有女生区。这就是为什么student.findfemale/result在第二个student上返回None,而您不能在None对象上调用.text。

ElementTree支持的是的子集,这对于您的示例来说可能更容易:

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作为变量名,因为您会删除主模块的名称

如果希望结果按文档顺序而不是按性别分组,可以执行以下操作:

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

谢谢你,老兄。但是我得到了这个错误。python new5.py male Traceback最近一次调用:文件new5.py,第40行,打印为“\t{:20}:{}”.formatstudent.find'name.text,student.find'result.text值错误:格式中的零长度字段名os python的版本是什么?您可能有Python2.6。使用“\t{0:20}:{1}”作为格式字符串。太棒了,这很管用。我使用的是2.6.6。对不起,我是这里的初学者,你介意解释一下最后一份打印的声明吗?打印“\t{:20}:{}”.formatstudent.find'name.text,student.find'result.text谢谢你,老兄..这是Python格式的