Python: доступ к вложенным вложенным элементам в XML-файле - PullRequest
0 голосов
/ 21 марта 2019

У меня есть XML-файл, структурированный следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<TEI>
   A
   <placeName xml:id="ene.0" n="0" key="geonames 644285" ref="http://www.geonames.org/644285">Pralognan</placeName>
   suivre
   <placeName xml:id="ene.3" n="2" subtype="compound" key="osm 2272301" ref="http://www.openstreetmap.org/way/2272301">
      la route entre
      <placeName xml:id="ene.1" n="1" key="osm 178528565" ref="http://www.openstreetmap.org/node/178528565">
         l'hôtel  de la
         <placeName n="0">Vanoise</placeName>
      </placeName>
      et celui du
      <placeName xml:id="ene.2" n="0" key="osm 3379120" ref="http://www.openstreetmap.org/way/3379120">Petit Mont Blanc</placeName>
   </placeName>
</TEI>

и код Python для его анализа:

import xml.etree.cElementTree as ET
parse_file    = open("file.xml","r")
tree_parse_file = ET.parse(parse_file)
root_parse_file = tree_parse_file.getroot()

for child in root_parse_file: # Child pointing on all sub child of root
    if "ref" in child.attrib.keys():
        #some code...
        for subChild in child: # To point on all of subChild of Child elements, this is line 59 of my code
        print(subChild.attrib['ref'])
        #some code... 

Когда я хочу выполнить итерации по этому элементу

<placeName xml:id="ene.3" ...>

чтобы получить все вложенные элементы и проанализировать их атрибуты, я получаю следующую ошибку в этой строке: print(subChild.attrib['ref']) error:

Traceback (most recent call last):
  File "./generate_long_lat2.py", line 59, in <module>
    print(subChild.attrib['ref'])
KeyError: 'ref'

и атрибут ref существует в дочернем элементе элемента

<placeName xml:id="ene.1" ...>

Мой вопрос: как я могу перебрать все вложенные дочерние элементы корневого элемента?

1 Ответ

0 голосов
/ 30 марта 2019

Чтобы перебрать атрибуты для определенного тега, вы можете использовать этот код (тег placeName, содержащий идентификатор):

from lxml import etree

tree = etree.parse("file.xml")

for attributes in tree.xpath("//placeName[(@xml:id)]"):
    for name, value in attributes.items():
        print(f'{name} = {value}')

Выход:

{http://www.w3.org/XML/1998/namespace}id = ene.0
n = 0
key = geonames 644285
ref = http://www.geonames.org/644285
{http://www.w3.org/XML/1998/namespace}id = ene.3
n = 2
subtype = compound
key = osm 2272301
ref = http://www.openstreetmap.org/way/2272301
{http://www.w3.org/XML/1998/namespace}id = ene.1
n = 1
key = osm 178528565
ref = http://www.openstreetmap.org/node/178528565
{http://www.w3.org/XML/1998/namespace}id = ene.2
n = 0
key = osm 3379120
ref = http://www.openstreetmap.org/way/3379120

Документация здесь -> https://lxml.de/tutorial.html#elements-carry-attributes-as-a-dict

...