Я новичок в 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>
то, что я пытаюсь сделать, это извлечь эти значения в красивую и чистую таблицу ниже:
Вот мой код до сих пор.. но я не мог понять, как получить подщелку:
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)
Заранее спасибо !
Вы можете создать словарь, который сопоставляет имена столбцов с выражениями 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
Если имена столбцов отличаются от имен тегов (как в вашем случае), то последнего примера недостаточно для построения таблицы.
Так вы можете пересечь дерево и печатать только текстовые узлы:
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.