如何遍历所选父项的 XML 树子项?
How to Iterate through XML tree children from chosen parent?
我想遍历我的 XML 树并从选定的父项中检索所有子项属性。这是我的解析设置:
import xml.etree.ElementTree as ET
file_name = 'myXML.xml'
tree = ET.parse(file_name)
root = tree.getroot()
我的函数使用了一个for循环,但是你需要一个for循环每一代的每一层:
本质上,每个父循环遍历每个子 returns .tag
, .text
, & .attrib
:
有没有一种方法可以在不知道层数的情况下循环收集所有这些数据?
def data_dump(k, mD, st):
for na in mD.iter(k):
for a in na:
print(st + '> a:: ', a.tag., a.text, a.attrib)
for b in a:
print('|-->', ' b:: ', b.tag, b.text, b.attrib)
for c in b:
print('|---->', ' c:: ', c.tag, c.text, c.attrib)
for d in c:
print('|------>', ' d:: ', d.tag, d.text, d.attrib)
这些是我的测试用例:
data_dump('Title', root, 'TITLE')
data_dump('Comment', root, 'COM')
data_dump('Steps', root, 'STEP')
data_dump('Transitions', root, 'TRANS')
data_dump('Branches', root, 'BRAN')
data_dump('Connections', root, 'CONN')
data_dump('Sequence', root, 'SEQ')
您的实施效率很低。随着 XML 中元素的增长,使用五个循环可能会大大增加 运行 时间。换句话说,O(n^5) 简直糟透了。
对于你的问题,我建议使用 XPath,阅读更多内容 here。
import xml.etree.ElementTree as ET
root = ET.parse(filename)
result = ''
for elem in root.findall('.//child/grandchild'):
if elem.attrib.get('name') == 'foo':
result = elem.text
break
您可以将相同的想法合并到您的函数中,并将其变成类似
的东西
def data_dump(element,value):
for elem in root.findall('.//parent/'+element):
if elem.attrib.get('name') == value:
text,attrib,tag = elem.text,elem.attrib,elem.tag
break
我想遍历我的 XML 树并从选定的父项中检索所有子项属性。这是我的解析设置:
import xml.etree.ElementTree as ET
file_name = 'myXML.xml'
tree = ET.parse(file_name)
root = tree.getroot()
我的函数使用了一个for循环,但是你需要一个for循环每一代的每一层:
本质上,每个父循环遍历每个子 returns .tag
, .text
, & .attrib
:
有没有一种方法可以在不知道层数的情况下循环收集所有这些数据?
def data_dump(k, mD, st):
for na in mD.iter(k):
for a in na:
print(st + '> a:: ', a.tag., a.text, a.attrib)
for b in a:
print('|-->', ' b:: ', b.tag, b.text, b.attrib)
for c in b:
print('|---->', ' c:: ', c.tag, c.text, c.attrib)
for d in c:
print('|------>', ' d:: ', d.tag, d.text, d.attrib)
这些是我的测试用例:
data_dump('Title', root, 'TITLE')
data_dump('Comment', root, 'COM')
data_dump('Steps', root, 'STEP')
data_dump('Transitions', root, 'TRANS')
data_dump('Branches', root, 'BRAN')
data_dump('Connections', root, 'CONN')
data_dump('Sequence', root, 'SEQ')
您的实施效率很低。随着 XML 中元素的增长,使用五个循环可能会大大增加 运行 时间。换句话说,O(n^5) 简直糟透了。
对于你的问题,我建议使用 XPath,阅读更多内容 here。
import xml.etree.ElementTree as ET
root = ET.parse(filename)
result = ''
for elem in root.findall('.//child/grandchild'):
if elem.attrib.get('name') == 'foo':
result = elem.text
break
您可以将相同的想法合并到您的函数中,并将其变成类似
的东西def data_dump(element,value):
for elem in root.findall('.//parent/'+element):
if elem.attrib.get('name') == value:
text,attrib,tag = elem.text,elem.attrib,elem.tag
break