Как получить (разобрать) дочерний элемент в XML из python

1

Я новичок в python или кодировании, поэтому, пожалуйста, будьте терпеливы с моим вопросом,

Итак, здесь мой загруженный XML

    <?xml version="1.0" encoding="utf-8"?>
<Total>
    <ID>999</ID>
    <Response>
        <Detail>
        <Nix>
            <Check>pass</Check>
        </Nix>  
        <MaxSegment>
            <Status>V</Status>
            <Input>
                <Name>
                    <First>jack</First>
                    <Last>smiths</Last>
                </Name>
                <Address>
                <StreetAddress1>100 rodeo dr</StreetAddress1>
                <City>long beach</City>
                <State>ca</State>
                <ZipCode>90802</ZipCode>
                </Address>
                <DriverLicense>
                    <Number>123456789</Number>
                    <State>ca</State>
                </DriverLicense>
                <Contact>
                <Email>[email protected]</Email>
                <Phones>
                    <Home>0000000000</Home>
                    <Work>1111111111</Work>
                </Phones>
                </Contact>
            </Input>
            <Type>Regular</Type>
        </MaxSegment>
        </Detail>
    </Response>
</Total>

то, что я пытаюсь сделать, это извлечь эти значения в красивую и чистую таблицу ниже:
Изображение 174551

Вот мой код до сих пор.. но я не мог понять, как получить подщелку:

   import os
os.chdir('d:/py/xml/')

import xml.etree.ElementTree as ET
tree = ET.parse('xxml.xml')
root=tree.getroot()
x = root.tag
y = root.attrib
print(x,y)

#---PRINT ALL NODES---
for child in root:
    print(child.tag, child.attrib)

Заранее спасибо !

Теги:
parsing

2 ответа

2
Лучший ответ

Вы можете создать словарь, который сопоставляет имена столбцов с выражениями xpath, которые извлекают соответствующие значения, например:

xpath = {
  "ID": "/Total/ID/text()",
  "Check": "/Total/Response/Detail/Nix/Check/text()", # or "//Check/text()"
}

Чтобы заполнить строку таблицы:

row = {name: tree.xpath(path) for name, path in xpath.items()}

Вышеприведенное предполагает, что вы используете lxml который поддерживает полный синтаксис xpath. ElementTree поддерживает только подмножество выражений XPath, но этого может быть достаточно в вашем случае (вы можете удалить выражение "text()" и использовать в этом случае el.text), например:

xpath = {
  "ID": ".//ID",
  "Check": ".//Check",
}
row = {name: tree.findtext(path) for name, path in xpath.items()}

Чтобы напечатать весь текст с соответствующими именами тегов:

import xml.etree.cElementTree as etree

for _, el in etree.iterparse("xxm.xml"):
    if el.text and not el: # leaf element with text
       print el.tag, el.text

Если имена столбцов отличаются от имен тегов (как в вашем случае), то последнего примера недостаточно для построения таблицы.

2

Так вы можете пересечь дерево и печатать только текстовые узлы:

def traverse(node):
    show = True
    for c in node.getchildren():
        show = False
        traverse(c)
    if show:
        print node.tag, node.text

для примера я получаю следующее:

traverse(root)

ID 999
Check pass
Status V
First jack
Last smiths
StreetAddress1 100 rodeo dr
City long beach
State ca
ZipCode 90802
Number 123456789
State ca
Email [email protected]
Home 0000000000
Work 1111111111
Type Regular

Вместо того, чтобы печатать, вы можете хранить (node.tag, node.text) кортежи или хранить {node.tag: node.text} в dict.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню