首页 > 解决方案 > 在 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('\t\t',c.tag)
                for d in c:
                    print('D')
                    print('\t\t\t',d.tag)
                    for e in d:
                        print('E')
                        print('\t\t\t\t',e.tag)

这给了我我正在寻找的东西,但必须有更好的方法来写这个。

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

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

谢谢!!

标签: pythonxmlelementtree

解决方案


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

迭代

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

推荐阅读