python lxml 遍历所有标签
python lxml loop through all tags
我有一个字典将每个 xml 标签映射到一个字典键。我想遍历 xml 中的每个标签和文本字段,并将其与关联的字典键值进行比较,后者是另一个字典中的键。
<2gMessage>
<Request>
<pid>daemon</pid>
<emf>123456</emf>
<SENum>2041788209</SENum>
<MM>
<MID>jbr1</MID>
<URL>http://jimsjumbojoint.com</URL>
</MM>
<AppID>reddit</AppID>
<CCS>
<Mode>
<SomeDate>true</CardPresent>
<Recurring>false</Recurring>
</Mode>
<Date>
<ASCII>B4788250000028291^RRR^15121015432112345601</ASCII>
</Date>
<Amount>100.00</Amount>
</CCS>
</Request>
</2gMessage>
我目前的代码:
parser = etree.XMLParser(ns_clean=True, remove_blank_text=True)
tree = etree.fromstring(strRequest, parser)
for tag in tree.xpath('//Request'):
subfields = tag.getchildren()
for subfield in subfields:
print (subfield.tag, subfield.text)
return strRequest
但是,这只会打印作为 Request 的直接子项的标签,如果它是同一循环中的实例,我希望能够访问子项的子项。我不想对值进行硬编码,因为标签和结构可以更改。
您可以尝试使用 iter()
函数。它将遍历所有 children 元素。比较长度是只打印没有children:
的
像这样的完整脚本:
from lxml import etree
tree = etree.parse('xmlfile')
for tag in tree.iter():
if not len(tag):
print (tag.tag, tag.text)
产量:
pid daemon
emf 123456
SENum 2041788209
MID jbr1
URL http://jimsjumbojoint.com
AppID reddit
CardPresent true
Recurring false
ASCII B4788250000028291^RRR^15121015432112345601
Amount 100.00
我有一个字典将每个 xml 标签映射到一个字典键。我想遍历 xml 中的每个标签和文本字段,并将其与关联的字典键值进行比较,后者是另一个字典中的键。
<2gMessage>
<Request>
<pid>daemon</pid>
<emf>123456</emf>
<SENum>2041788209</SENum>
<MM>
<MID>jbr1</MID>
<URL>http://jimsjumbojoint.com</URL>
</MM>
<AppID>reddit</AppID>
<CCS>
<Mode>
<SomeDate>true</CardPresent>
<Recurring>false</Recurring>
</Mode>
<Date>
<ASCII>B4788250000028291^RRR^15121015432112345601</ASCII>
</Date>
<Amount>100.00</Amount>
</CCS>
</Request>
</2gMessage>
我目前的代码:
parser = etree.XMLParser(ns_clean=True, remove_blank_text=True)
tree = etree.fromstring(strRequest, parser)
for tag in tree.xpath('//Request'):
subfields = tag.getchildren()
for subfield in subfields:
print (subfield.tag, subfield.text)
return strRequest
但是,这只会打印作为 Request 的直接子项的标签,如果它是同一循环中的实例,我希望能够访问子项的子项。我不想对值进行硬编码,因为标签和结构可以更改。
您可以尝试使用 iter()
函数。它将遍历所有 children 元素。比较长度是只打印没有children:
像这样的完整脚本:
from lxml import etree
tree = etree.parse('xmlfile')
for tag in tree.iter():
if not len(tag):
print (tag.tag, tag.text)
产量:
pid daemon
emf 123456
SENum 2041788209
MID jbr1
URL http://jimsjumbojoint.com
AppID reddit
CardPresent true
Recurring false
ASCII B4788250000028291^RRR^15121015432112345601
Amount 100.00