найти и сохранить в списке теги XML с тем же именем, Python - PullRequest
2 голосов
/ 12 ноября 2019

Я работаю над программой на Python, проанализировав XML-файл с помощью ElementTree. XML-файл содержит несколько записей о студентах, например, тот, который я привожу здесь. Моя проблема в том, что я хочу сохранить в списке для каждого студента каждый тег имени. В каждом теге учащегося можно найти несколько дочерних тегов «name» (я не имею в виду определенное число). Я попробовал следующий метод, но я могу получить только первый тег 'name'. Кто-нибудь может мне помочь?

<student>
    <id>A100</id>
    <name>John</name>
    <name>Johny</name>
    <dob>11/01/1999</dob>
</student>

tree = ET.parse(filename)
root = tree.getroot()
list1 = root.findall('student')
    for i in list1:
        k = i.find('name').text
        names.append(k)

Ответы [ 2 ]

3 голосов
/ 12 ноября 2019

Это даст вам словарь имен с тэгом «id», используемым в качестве ключа для каждого ученика. Затем вы можете разобрать словарь по своему усмотрению:

import xml.etree.ElementTree as ET

xml_string = """<root_records>
<student>
    <id>A100</id>
    <name>John</name>
    <name>Johny</name>
    <dob>11/01/1999</dob>
</student>
<student>
    <id>A140</id>
    <name>Mat</name>
    <name>Matthew</name>
    <dob>01/01/1995</dob>
</student></root_records>"""

tree = ET.fromstring(xml_string)
names = {}

for i in tree.iter("student"):
    student_id = i.find("id").text
    k = [x.text for x in i.findall('name')]
    names[student_id] = k

print(names)

Вывод:

{'A140': ['Mat', 'Matthew'], 'A100': ['John', 'Johny']}
1 голос
/ 12 ноября 2019

Вы можете просто найти все теги имен и получить текстовое значение, используя понимание списка, независимо от количества тегов имен.

data.xml

<data>
    <student>
        <id>A100</id>
        <name>John</name>
        <name>Johny</name>
        <dob>11/01/1999</dob>
    </student>
    <student>
        <id>A100</id>
        <name>Adam</name>
        <name>David</name>
        <dob>11/01/1999</dob>
    </student>
    <student>
        <id>A100</id>
        <name>Barry</name>
        <name>Liam</name>
        <dob>11/01/1999</dob>
    </student>
</data>

Мы можем использовать синтаксис xpath, чтобы найти все элементы имени в дереве, которые имеют родительский элемент ученика. Мы заключаем это в понимание списка Python, чтобы захватить только имена в списке

import xml.etree.ElementTree as ET
tree = ET.parse('data.xml')
names = []
seperator = '-----'
students = tree.findall('student')
for student in students:
    student_names = [name.text for name in student.findall('name')]
    names += student_names + [seperator]

#pop the last seperator off the end and print the list
names.pop()
print(names)

OUTPUT

['John', 'Johny', '-----', 'Adam', 'David', '-----', 'Barry', 'Liam']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...