python - 在 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
我希望写类似“在此节点中,检查是否有子节点。如果没有,则结束。如果有,则列出子节点,并且对于每个子节点,是否还有其他子节点? 如果是这样......重复向下直到没有新的层可以向下钻取。
谢谢!!
解决方案
如果您的输入对嵌套数量有一个已知限制,并且该数量小于解释器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
推荐阅读
- ruby-on-rails - 在 Rails 中,如何使用搜索表单标签更改控制器方法的参数?
- python - multiprocessing.pool ThreadPool 不执行底层函数
- fullscreen - JSSOR 切换全屏
- django - 如何正确重命名 wagtail 页面模型
- c++ - 为什么我会收到此错误?“孩子未申报?
- amazon-aurora - 亚马逊极光只读 {TrueIfReplica}
- powershell - 在powershell中打开exe文件,然后在exe关闭并运行命令时关闭powershell的命令?
- python - 从 CLI 接收输入并更新 yaml 文件
- xamarin.forms - Xamarin IOS 开发配置文件的手动配置。它选择了哪个配置?
- vue.js - Nuxt.js 头功能在文章中不起作用