首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML解析器返回NoneType

XML解析器返回NoneType
EN

Stack Overflow用户
提问于 2020-03-31 13:42:02
回答 2查看 343关注 0票数 0

我试图使用Python中的ElementTree XML解析下面的XML格式,但是当我使用.text时,它会给出属性错误。

代码语言:javascript
复制
<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>

这是我的代码:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-31 14:13:09

下面的代码按条目名称聚合每个条目的成员。

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
{'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']}
票数 0
EN

Stack Overflow用户

发布于 2020-04-08 08:10:39

你问题的根源是:

  • in for mem in ip.findall('member'):循环mem是当前的成员元素
  • ,但是这个循环中的第一个指令是member = mem.find('member'),所以您尝试在当前成员中找到另一个(嵌套)成员,该成员不存在。

代码中的另一个缺陷是,打印没有任何文本的节点是没有意义的。

将循环更改为下面的代码:

代码语言:javascript
复制
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)

你就会得到有意义的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60952029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档