【发布时间】:2016-09-07 07:42:57
【问题描述】:
我正在尝试遍历这个充满父->子关系的 XML 数据,并且需要一种构建树的方法。任何帮助将不胜感激。另外,在这种情况下,为父->子关系具有属性或节点是否更好?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<nodes>
<node name="Car" child="Engine"/>
<node name="Car" child="Wheel"/>
<node name="Engine" child="Piston"/>
<node name="Engine" child="Carb"/>
<node name="Carb" child="Bolt"/>
<node name="Spare Wheel"/>
<node name="Bolt" child="Thread"/>
<node name="Carb" child="Foat"/>
<node name="Truck" child="Engine"/>
<node name="Engine" child="Bolt"/>
<node name="Wheel" child="Hubcap"/>
</nodes>
在 Python 脚本上,这就是我所拥有的。我的大脑被炸了,我无法理解逻辑?请帮忙
import xml.etree.ElementTree as ET
tree = ET.parse('rec.xml')
root = tree.getroot()
def find_node(data,search):
#str = root.find('.//node[@child="1.2.1"]')
for node in data.findall('.//node'):
if node.attrib['name']==search:
print('Child-->', node)
for nodes in root.findall('node'):
parent = nodes.attrib.get('name')
child = nodes.attrib.get('child')
print (parent,'-->', child)
find_node(root,child)
预期的可能输出是这样的(真的不关心排序顺序,只要所有节点项都表示在树中的某个位置。
Car --> Engine --> Piston
Car --> Engine --> Carb --> Float
Car --> Engine --> Carb --> Bolt --> Thread
Car --> Wheel --> Hubcaps
Truck --> Engine --> Piston
Truck --> Engine --> Carb --> Bolt --> Thread
Truck --> Loading Bin
Spare Wheel -->
【问题讨论】:
-
我想整理 bpmn 流程模型,其中 [parent] = 流程的模型名称,[child] = 该流程上的活动。我只有一个带有活动对象的模型列表,但其中一些活动被定义为具有自己孩子的模型[父]。我对具体的输出不太在意,但我把 1.2 放在了顶层,因为它从来不是任何其他模型的子...
-
你的问题太有趣了,我发了related one。我有一个 XSLT 解决方案,差点发布但不满意,我不得不邀请 XSLT 专家寻求更动态的解决方案。
-
关于 XSLT 解决方案,我刚刚发布了一个。它在计算上也是最简单的——将嵌套级别 1 与嵌套级别 4 - 5 进行比较……转换可以简单地从 Python 调用。享受:)
-
正如@DimitreNovaatchev 建议的那样,使用Python 的
lxml模块来运行XSLT。在 Python 中避免任何循环。
标签: python xml xml-parsing hierarchical-data