使用 ElementTree 解析 Python XML 返回无

Mar*_*rty 3 python xml elementtree

我正在尝试使用 Python 中的 ElementTree 解析这个 xml 字符串,

存储为字符串的数据,

xml = '''<?xml version="1.0" encoding="utf-8"?>
<SearchResults xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Student>
    <RollNumber>1</RollNumber>
    <Name>Abel</Name>
    <PhoneNumber>Not Included</PhoneNumber>
    <Email>abel@hisschool.edu</Email>
    <Grade>7</Grade>
</Student>
<Student>
    <RollNumber>2</RollNumber>
    <Name>Joseph</Name>
    <PhoneNumber>Not Included</PhoneNumber>
    <Email>joseph@hisschool.edu</Email>
    <Grade>7</Grade>
</Student>
<Student>
    <RollNumber>3</RollNumber>
    <Name>Mike</Name>
    <PhoneNumber>Not Included</PhoneNumber>
    <Email>mike@hisschool.edu</Email>
    <Grade>7</Grade>
</Student>
</SearchResults>'''
Run Code Online (Sandbox Code Playgroud)

我用来将这个字符串解析为 xml 的代码,

from xml.etree import ElementTree

xml = ElementTree.fromstring(xml)

results = xml.findall('Student')

for students in results:
    for student in students:
        print student.get('Name')
Run Code Online (Sandbox Code Playgroud)

print results 将结果打印为元素,

[<Element 'Student' at 0x7feb615b4ad0>, <Element 'Student' at 0x7feb615b4c50>, <Element 'Student' at 0x7feb615b4e10>]
Run Code Online (Sandbox Code Playgroud)

在 for 循环内,print students 打印出相同的内容,

<Element 'Student' at 0x7fd722d88ad0>
<Element 'Student' at 0x7fd722d88c50>
<Element 'Student' at 0x7fd722d88e10>
Run Code Online (Sandbox Code Playgroud)

无论如何,当我尝试使用 获取学生的姓名时print student.get('Name'),程序返回无。

我想要做的是从每个标签的 xml 中提取值并构造一个 dict。

Mar*_*ers 6

你在这里有一个双循环:

for students in results:
    for student in students:
        print student.get('Name')
Run Code Online (Sandbox Code Playgroud)

students是一个<Student>元素。通过迭代,您可以获得该元素中包含的单个元素。那些包含的元素(<RollNumber>、<Name>等)没有Name属性。

该.get()方法仅访问属性,但您似乎想要获取<Name>元素。.find()在此处使用或 XPath 表达式:

for student in results:
    name = student.find('Name')
    if name is not None:
        print name.text
Run Code Online (Sandbox Code Playgroud)

或者

for student_name in xml.findall('.//Student/Name'):
    print name.text
Run Code Online (Sandbox Code Playgroud)