XML парсер возвращает NoneType - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь проанализировать формат ниже XML, используя ElementTree XML в Python, но я получаю "member" как None, когда я использую .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)

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Источник вашей проблемы в том, что:

  • в пределах for mem in ip.findall('member'): l oop mem является текущим членом элементом,
  • , но первой инструкцией в этом l oop является member = mem.find('member'), поэтому вы пытаетесь найти другой (вложенный) член в текущем члене , который не существует .

Еще один недостаток в вашем коде заключается в том, что нет смысла печатать узел, у которого нет текста.

Измените свой l oop на код, приведенный ниже:

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 голосов
/ 31 марта 2020

Код ниже объединяет членов каждой записи по имени записи

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)

output

{'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']}
...