etree вставьте атрибут узла в отфильтрованные потомки - PullRequest
0 голосов
/ 22 февраля 2019

Я обрабатываю XML-файл.Я хочу создать вывод в виде списка кортежей для массовой вставки в базу данных.

проблема, которую я не могу достичь, это вставка @id из узла в выбранные атрибуты дочерних узлов.

Это мой пример док.Обратите внимание, что в моем реальном файле есть намного больше атрибутов на каждом уровне, которые необходимо отфильтровать.Я создал этот XML-файл как более удобный пример.

doc = """
<region id="5153419" name="North Shore" date="2019-02-15T00:00:00" >
  <shire abbrevname="Manly Council" code="20019" website="http://" >
  <location id="5178566" site="1" division="Dee Why" staff="3" >
    <reference isbn="978-1-891830-75-4" rating="Mature (18+)" title="110 Per¢" author="Tony Consiglio"/>
    <reference isbn="978-1-60309-2395" rating="Mature (16+)" title="American Elf 1999" author="James Kochalka" />
    <reference isbn="978-1-891830-37-2" rating="Young Adult (13+)" title="The Barefoot Serpent (softcover)" author="Scott Morse" />
    <reference isbn="978-1-891830-56-3" rating="Mature (16+)" title="Bighead" author="Jeffrey Brown"  />
    <reference isbn="978-1-891830-19-8" rating="Mature (18+)" title="Box Office Poison" author="Alex Robinson"  />
  </location>
  <location id="5178568" site="2" division="Brookvale" staff="5">
    <reference isbn="978-1-891830-37-2" rating="Young Adult (13+)" title="The Barefoot Serpent (softcover)" author="Scott Morse"/>
    <reference isbn="978-1-936561-69-8" rating="Adults Only (18+)" title="Chester 5000 (Book 2)" author="Isabelle George" />
    <reference isbn="978-1-891830-81-5" rating="Young Adult (13+)" title="Cry Yourself to Sleep" author="Jeremy Tinder" />
    <reference isbn="978-1-891830-75-4" rating="Mature (18+)" title="110 Per¢" author="Tony Consiglio" />
    <reference isbn="978-1-891830-77-8" rating="Mature (16+)" title="Every Girl is the End of the World for Me" author="Jeffrey Brown" />
    <reference isbn="978-0-9585783-4-9" rating="Mature (18+)" title="From Hell" author="Alan Moore and Eddie Campbell" />
  </location> 
  </shire>
</region>
"""

Мой желаемый результат будет

(идентификатор местоположения, isbn, заголовок)

[(5153419, 978-1-891830-75-4,110 Per¢),(5153419, 978-1-60309-2395, American Elf 1999).......(5178568,978-0-9585783-4-9,From Hell)]

Попробовал этомного способов getiterator, findall.Просто не могу найти способ добиться этого.

filter_reference = ['isbn', 'title']
output_list = []
for child in tree.findall('.//reference'):
    for k,v in child.items():
        if k in filter_reference:
            output_list.append(v)

1 Ответ

0 голосов
/ 22 февраля 2019

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

import xml.etree.ElementTree as et

doc = """
your doc
"""
root = et.fromstring(doc)
result = []

for shire in root:
    for location in shire:
        location_id = location.attrib.get('id')
        for reference in location:
            list_of_attribs = [reference.attrib.get(x) for x in filter_reference]
            result.append((location_id, list_of_attribs))

print(result) # [('5178566', '978-1-891830-75-4', '110 Per¢'), ('5178566', '978-1-60309-2395', 'American Elf 1999'), ('5178566', '978-1-891830-37-2', 'The Barefoot Serpent (softcover)'), ('5178566', '978-1-891830-56-3', 'Bighead'), ('5178566', '978-1-891830-19-8', 'Box Office Poison'), ('5178568', '978-1-891830-37-2', 'The Barefoot Serpent (softcover)'), ('5178568', '978-1-936561-69-8', 'Chester 5000 (Book 2)'), ('5178568', '978-1-891830-81-5', 'Cry Yourself to Sleep'), ('5178568', '978-1-891830-75-4', '110 Per¢'), ('5178568', '978-1-891830-77-8', 'Every Girl is the End of the World for Me'), ('5178568', '978-0-9585783-4-9', 'From Hell')]
...