如何递归地遍历xml文件,访问子节点/元素,并使用Python存储它们的数据?
我有一个如下所示的XML文件。现在我需要访问如何递归地遍历xml文件,访问子节点/元素,并使用Python存储它们的数据?,python,xml,xml-parsing,elementtree,Python,Xml,Xml Parsing,Elementtree,我有一个如下所示的XML文件。现在我需要访问port->name,port->wire->direction,port->wire->driver->deffal。XML文件的大小非常大 我该如何处理这个问题 <spirit:Bus> <spirit:Ports> <spirit:port> <spirit:name>ABCPORT</spirit:name>
port->name
,port->wire->direction
,port->wire->driver->deffal
。XML文件的大小非常大
我该如何处理这个问题
<spirit:Bus>
<spirit:Ports>
<spirit:port>
<spirit:name>ABCPORT</spirit:name>
<spirit:description>SOME DESCRIPTION</spirit:description>
<spirit:wire>
<spirit:direction>INPUT</spirit:direction>
<spirit:driver>
<spirit:defaultValue>0</spirit:defaultValue>
</spirit:driver>
</spirit:wire>
</spirit:port>
<spirit:port>
<spirit:name>PQRPORT</spirit:name>
<spirit:description>SOME DESCRIPTION</spirit:description>
<spirit:wire>
<spirit:direction>OUTPUT</spirit:direction>
</spirit:wire>
</spirit:port>
</spirit:ports>
</spirit:Bus>
阿伯特
一些描述
输入
0
PQRPORT
一些描述
输出
我认为解决这个问题的最好方法是使用lxml和xpath:
from lxml import etree
#the xml below is somewhat different than the one in the question, because of a type and the declare namespaces
spirit = """<?xml version="1.0" encoding="UTF-8"?>
<doc xmlns:spirit="http://example.com">
<spirit:Bus>
<spirit:Ports>
<spirit:port>
<spirit:name>ABCPORT</spirit:name>
<spirit:description>SOME DESCRIPTION</spirit:description>
<spirit:wire>
<spirit:direction>INPUT</spirit:direction>
<spirit:driver>
<spirit:defaultValue>0</spirit:defaultValue>
</spirit:driver>
</spirit:wire>
</spirit:port>
<spirit:port>
<spirit:name>PQRPORT</spirit:name>
<spirit:description>SOME DESCRIPTION</spirit:description>
<spirit:wire>
<spirit:direction>OUTPUT</spirit:direction>
</spirit:wire>
</spirit:port>
</spirit:Ports>
</spirit:Bus>
</doc>
"""
doc = etree.XML(spirit.encode('utf-8'))
ports = doc.xpath('//*[local-name()="port"]')
for port in ports:
try:
print("Port-",port.xpath('.//*[local-name()="name"]')[0].text)
print("Direction",port.xpath('.//*[local-name()="direction"]')[0].text)
print("Default value",port.xpath('.//*[local-name()="defaultValue"]')[0].text)
except:
continue
为了正确格式化XML,我在示例中添加了名称空间:
<spirit:Bus xmlns:spirit="http://dummy.com">
...
</spirit:Bus>
注意,XML包含一个名称空间规范,因此
在代码中指定它
我的代码还显示了如何获取节点的本地名称(没有名称空间)
对于您的样本,结果是:
port ABCPORT INPUT 0
port PQRPORT OUTPUT None
ElementTree
位于标准库中。看见如果您对如何使用它有疑问,请将您的问题与您尝试过的代码一起发布。您想要的输出是0
?我想要类似-Port ABCPORT、Direction Input、Default value-0;端口PQRPORT,方向输出。
import xml.etree.ElementTree as et
tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'spirit': 'http://dummy.com'}
for nd in root.findall('spirit:Ports/spirit:port', ns):
print(nd.tag.split('}')[1], nd.findtext('spirit:name', namespaces=ns),
nd.findtext('spirit:wire/spirit:direction', namespaces=ns),
nd.findtext('spirit:wire/spirit:driver/spirit:defaultValue', namespaces=ns))
port ABCPORT INPUT 0
port PQRPORT OUTPUT None