XML 解析器 returns 无类型
XML parser returns NoneType
我正在尝试使用 Python 中的 ElementTree XML 解析以下 XML 格式,但是当我使用.text
给出属性错误
<address-group>
<entry name="TBR">
<static>
<member>TBR1-1.1.1.1_21</member>
<member>TBR2-2.2.2.2_24</member>
<member>TBR3-3.3.3.3_21</member>
<member>TBR4-4.4.4.4_24</member>
</static>
</entry>
<address-group>
这是我的代码:
import xml.etree.ElementTree as ET
tree = ET.parse("addrgrp.xml")
root = tree.getroot()
tag = root.tag
print (tag)
attr = root.attrib
for entries in root.findall("entry"):
name = entries.get('name')
print (name)
ip = entries.find('static')
print (ip)
for mem in ip.findall('member'):
member = mem.find('member')
print (member)
下面的代码按条目名称聚合每个条目的成员
import xml.etree.ElementTree as ET
import pprint
XML = '''
<address-group>
<entry name="TBR1">
<static>
<member>TBR1-1.1.1.1_21</member>
<member>TBR2-2.2.2.2_24</member>
<member>TBR3-3.3.3.3_21</member>
<member>TBR4-4.4.4.4_24</member>
</static>
</entry>
<entry name="TBR2">
<static>
<member>TBR1-4.1.1.1_21</member>
<member>TBR2-4.2.2.2_24</member>
<member>TBR3-4.3.3.3_21</member>
<member>TBR4-9.4.4.4_24</member>
</static>
</entry>
</address-group>'''
root = ET.fromstring(XML)
data_by_entry = {}
entries = root.findall('.//entry')
for entry in entries:
data_by_entry[entry.attrib['name']] = [m.text for m in entry.findall('./static/member')]
pprint.pprint(data_by_entry)
输出
{'TBR1': ['TBR1-1.1.1.1_21',
'TBR2-2.2.2.2_24',
'TBR3-3.3.3.3_21',
'TBR4-4.4.4.4_24'],
'TBR2': ['TBR1-4.1.1.1_21',
'TBR2-4.2.2.2_24',
'TBR3-4.3.3.3_21',
'TBR4-9.4.4.4_24']}
您的问题根源在于:
- 在
for mem in ip.findall('member'):
循环中mem是当前的member元素,
- 但是这个循环中的第一条指令是
member = mem.find('member')
,
因此您尝试在当前 成员 中查找 另一个 (嵌套)成员,
不存在。
你的代码中的另一个缺陷是打印一个节点没有意义
没有任何文字。
将循环更改为以下代码:
for entries in root.findall('entry'):
name = entries.get('name')
print(name)
ip = entries.find('static')
print('Members:')
for mem in ip.findall('member'):
print(mem.text)
你会得到有意义的结果。
我正在尝试使用 Python 中的 ElementTree XML 解析以下 XML 格式,但是当我使用.text
给出属性错误
<address-group>
<entry name="TBR">
<static>
<member>TBR1-1.1.1.1_21</member>
<member>TBR2-2.2.2.2_24</member>
<member>TBR3-3.3.3.3_21</member>
<member>TBR4-4.4.4.4_24</member>
</static>
</entry>
<address-group>
这是我的代码:
import xml.etree.ElementTree as ET
tree = ET.parse("addrgrp.xml")
root = tree.getroot()
tag = root.tag
print (tag)
attr = root.attrib
for entries in root.findall("entry"):
name = entries.get('name')
print (name)
ip = entries.find('static')
print (ip)
for mem in ip.findall('member'):
member = mem.find('member')
print (member)
下面的代码按条目名称聚合每个条目的成员
import xml.etree.ElementTree as ET
import pprint
XML = '''
<address-group>
<entry name="TBR1">
<static>
<member>TBR1-1.1.1.1_21</member>
<member>TBR2-2.2.2.2_24</member>
<member>TBR3-3.3.3.3_21</member>
<member>TBR4-4.4.4.4_24</member>
</static>
</entry>
<entry name="TBR2">
<static>
<member>TBR1-4.1.1.1_21</member>
<member>TBR2-4.2.2.2_24</member>
<member>TBR3-4.3.3.3_21</member>
<member>TBR4-9.4.4.4_24</member>
</static>
</entry>
</address-group>'''
root = ET.fromstring(XML)
data_by_entry = {}
entries = root.findall('.//entry')
for entry in entries:
data_by_entry[entry.attrib['name']] = [m.text for m in entry.findall('./static/member')]
pprint.pprint(data_by_entry)
输出
{'TBR1': ['TBR1-1.1.1.1_21',
'TBR2-2.2.2.2_24',
'TBR3-3.3.3.3_21',
'TBR4-4.4.4.4_24'],
'TBR2': ['TBR1-4.1.1.1_21',
'TBR2-4.2.2.2_24',
'TBR3-4.3.3.3_21',
'TBR4-9.4.4.4_24']}
您的问题根源在于:
- 在
for mem in ip.findall('member'):
循环中mem是当前的member元素, - 但是这个循环中的第一条指令是
member = mem.find('member')
, 因此您尝试在当前 成员 中查找 另一个 (嵌套)成员, 不存在。
你的代码中的另一个缺陷是打印一个节点没有意义 没有任何文字。
将循环更改为以下代码:
for entries in root.findall('entry'):
name = entries.get('name')
print(name)
ip = entries.find('static')
print('Members:')
for mem in ip.findall('member'):
print(mem.text)
你会得到有意义的结果。