在XML文件中查找子项的更好方法比这更好?



所以我有一些不同的XML文件,它们并不都具有相同的格式或数据元素。我想编写一些代码,通过检查每个节点并查看它是否有子节点,然后检查子节点的子节点,等等,为我提供所有不同类型节点的列表。

我可以把它写出来,这样它就以静态的方式完成,但我宁愿让它测试以查看每个节点是否有一个节点,并继续向下钻取。

例如,我已经这样做了:


import xml.etree.ElementTree as ET
tree = ET.iterparse('vx19.xml')
for _, el in tree:
if '}' in el.tag:
el.tag = el.tag.split('}', 1)[1]  # strip all namespaces
for at in el.attrib.keys(): # strip namespaces of attributes too
if '}' in at:
newat = at.split('}', 1)[1]
el.attrib[newat] = el.attrib[at]
del el.attrib[at]
root = tree.root
for a in root:
print(a.tag)
if a[0]:
for b in a:
print('t',b.tag)
for c in b:
print('C')
print('tt',c.tag)
for d in c:
print('D')
print('ttt',d.tag)
for e in d:
print('E')
print('tttt',e.tag)

这给了我想要的东西,但必须有更好的方法来写这个。

B
Method Def
C
TriggerOn
C
Formal Expression
C
Form Ref
C
Actions
D
Identifiers
E
Identifier
E
Identifier
E
Identifier

我希望写这样的东西,"在这个节点中,检查是否有子节点。如果没有,请结束。如果是这样,则列出子节点,并且对于每个子节点,是否还有其他子节点?㞖。。。。向下重复,直到没有新层可供向下钻取。

谢谢!!

如果您的输入对嵌套数有已知的限制,并且该数量小于cpython解释器的max recursion limit,则可以使用简单递归来实现该行为,否则将使用列表和迭代算法。

迭代

def iterative(root, result: set):
queue = [root]
for item in queue:
result.add(item.tag)
for elem in item:
queue.append(elem)
return result

递归

def recursive(root, result: set):
for item in root:
result.add(item.tag)
for elem in item:
recurse(item, result)
return result

最新更新