提问人:Michal 提问时间:4/18/2023 最后编辑:Michal 更新时间:4/18/2023 访问量:67
有没有办法使用中断的 XML 树结构检索树结构?
Is there a way to retrieve tree structure with break XML tree structure?
问:
我正在尝试遍历具有许多嵌套子项的XML文件。据我了解,常见的XML结构具有父>子项>许多其他子项等...
当这种结构不是那么严格并且它被用作某种节点HEAD_NODE和节点编号的链表时会发生什么。其中,祖先HEAD_NODE指向父级的 NODE,从而创建整个结构。
...
<AAA>
<BB>
<HEAD_NODE> 0</HEAD_NODE>
<NODE> 1</NODE>
<LVL> 1</LVL>
...
<BB>
<HEAD_NODE> 1</HEAD_NODE>
<NODE> 2</NODE>
<LVL> 2</LVL>
...
<BB>
<HEAD_NODE> 2</HEAD_NODE>
<NODE> 3</NODE>
<LVL> 3</LVL>
...
<BB>
<HEAD_NODE> 3</HEAD_NODE>
<NODE> 4</NODE>
<LVL> 4</LVL>
...
<BB>
<HEAD_NODE> 4</HEAD_NODE>
<NODE> 5</NODE>
<LVL> 5</LVL>
...
<BB>
<HEAD_NODE> 3</HEAD_NODE>
<NODE> 17</NODE>
<LVL> 4</LVL>
...
<BB>
<HEAD_NODE> 17</HEAD_NODE>
<NODE> 18</NODE>
<LVL> 5</LVL>
...
</BB>
<BB>
<HEAD_NODE> 17</HEAD_NODE>
<NODE> 19</NODE>
<LVL> 5</LVL>
...
<BB>
<HEAD_NODE> 3</HEAD_NODE>
<NODE> 145</NODE>
<LVL> 4</LVL>
<BB>
<HEAD_NODE> 145</HEAD_NODE>
<NODE> 163</NODE>
<LVL> 5</LVL>
</BB>
<BB>
<HEAD_NODE> 145</HEAD_NODE>
<NODE> 164</NODE>
<LVL> 5</LVL>
</BB>
<BB>
<HEAD_NODE> 145</HEAD_NODE>
<NODE> 165</NODE>
<LVL> 5</LVL>
</BB>
<BB>
<HEAD_NODE> 145</HEAD_NODE>
<NODE> 166</NODE>
<LVL> 5</LVL>
</BB>
<BB>
<HEAD_NODE> 145</HEAD_NODE>
<NODE> 167</NODE>
<LVL> 5</LVL>
</BB>
<BB>
<HEAD_NODE> 145</HEAD_NODE>
<NODE> 168</NODE>
<LVL> 5</LVL>
...
</BB>
...
在某些情况下,此结构对应于 XML 结构,但在某些情况下则不对应。
使用 Xpath,我能够获得叶节点,基本上是应该在这些树末尾的节点。
from lxml import etree
tree = etree.parse('file.xml')
root = tree.getroot()
leaf_elements = root.xpath('//*[local-name()="BB"][not(.//*[local-name()="BB"])]/*[local-name()="HEAD_NODE"]')
我的问题是,如何以某种有意义的方式去收获所有这些树(所有这些节点都包含其他信息,我也希望看到这条路径)。
感谢您的任何提示。
更新
我混合了库,它返回了更好的结果。它仍然不是 100% 的解决方案,但已经接近了networkx
lxml
from lxml import etree
import networkx as nx
# create empty graph
G = nx.DiGraph()
for head_node in root.xpath('//ns:HEAD_NODE', namespaces=ns):
node_id = head_node.text.strip()
G.add_node(head_node)
for node in head_node.xpath('./following-sibling::ns:NODE', namespaces=ns):
child_id = node.text.strip()
G.add_edge(node_id, child_id)
# I can look for all these path
nx.shortest_path(G, source='0', target='442')```
答: 暂无答案
评论