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

В настоящее время я загружаю этот xml-файл в beautifulsoup в python и читаю каждый узел отдельно. Проблема, которую я вижу, заключается в том, что я не знаю, сколько там родительских узлов и что они собой представляют.

Как быстрее всего найти набор родительских узлов и соответствующих дочерних узлов?

<AppTestData>
    <Contact>
        <Name>
         <First name> foo</First name>
         <last name> bar</last name>
        </Name>
        <Age>33</Age>
        <City>York</City>
        ...
    </Contact>
    <Agent>
        <Code>A103S</Code>
        <Region>North</North>
        <Resp>Service</Resp>
        ....
    </Agent>
    <Product>
        <Cat>Electronics</Cat>
        ...
    </Product> 
</AppTestData>

Обнадеживающий вывод:

AppTestData -> Contact -> [Name, age, city]
AppTestData -> Contact -> Name ->[first name, last name]
AppTestData -> Agent -> [Code, Region, Resp]
-1
tandem 11 Дек 2020 в 16:33

1 ответ

Лучший ответ

Попробуй это. Я изменил ошибку в вашем XML.

from simplified_scrapy import  utils, SimplifiedDoc
xml = '''
<AppTestData>
    <Contact>
        <Name>
         <First_name> foo</First_name>
         <last_name> bar</last_name>
        </Name>
        <Age>33</Age>
        <City>York</City>
        ...
    </Contact>
    <Agent>
        <Code>A103S</Code>
        <Region>North</Region>
        <Resp>Service</Resp>
        ....
    </Agent>
    <Product>
        <Cat>Electronics</Cat>
        ...
    </Product> 
</AppTestData>
'''

def printTag(lst, parent):
    if len(lst)==1:
        parent.append(lst[0].tag)
        print (parent)
        return

    flag = False
    for ele in lst:
        children = ele.children
        if not children:
            flag = True
        else:
            p = parent[:]
            p.append(ele.tag)
            printTag(children,p)
    if flag:
        parent.append(lst.tag)
        print (parent)

# xml = utils.getFileContent('data.xml')
doc  = SimplifiedDoc(xml)
root  = doc.child
children = root.children
printTag(children,[root.tag])

Результат:

['AppTestData', 'Contact', 'Name', ['First_name', 'last_name']]
['AppTestData', 'Contact', ['Name', 'Age', 'City']]
['AppTestData', 'Agent', ['Code', 'Region', 'Resp']]
['AppTestData', 'Product', 'Cat']
0
yazz 14 Дек 2020 в 06:48