我只想要XML元素的直接子元素,而不是所有后代

时间:2015-05-26 18:20:52

标签: python xml dom xml-parsing

我有一个表示有向图的XML文档。它包含大量直接子节点,都带有id,以及大量嵌套子节点,它们都具有相同的标记名称但没有id,只是引用。

我想迭代根节点的所有直接子节点,但是排除嵌套子节点。文件看起来像这样,但有数百个节点和几十个不同的标签:

<graph>
    <foo id="f1"><bar ref="b1" /><baz ref="z1" />...</foo>
    <bar id="b1"><foo ref="f1" /></bar>
    <baz id="z1"></baz>
    ...
</graph>

我不想使用getElementsByTagName,因为它会返回所有后代。我怀疑我需要使用.childnodes并过滤结果,但我想确保没有我遗漏的东西。

另外,我无法控制输入,它来自外部源,我使用的是Python的xml.dom.minidom模块,但我希望这是一个实现细节。

2 个答案:

答案 0 :(得分:1)

不确定你想要从被指导的孩子那里得到什么,所以给了你几个不同的例子。

strings.xml

答案 1 :(得分:1)

作为信息(给亚历山德罗):

对于 xml.dom.minidom,您可以找到这样的示例,以从具有给定类型(名称)的节点 (xmlNode) 中获取子节点:

children = xmlNode.getElementsByTagName(name)

如果您在给定示例中使用 graph 上的代码段来获取所有 foo,您将不会得到 1 foo 而是 2。

为什么?

foo 中还有另一个 bar

<bar id="b1">

  <foo ref="f1" />

</bar>

网上找到的所有示例都使用了查找所有元素的函数,这些元素位于给定节点下的树中某处

修复?

也许,还在寻找一个。 (可能有 - 也可能没有。)

目前正在测试使用

获取列表
xmlNode.childNodes

这个问题似乎是 getElementsByTagName 在您获得的节点上不可用。但我不在乎。

并且由于某种原因它在较低层停止。所以我正在研究访问列表的元素。

开始研究

xmlNode.childNodes.item(i)

因为它还没有按预期工作。 (0 次调用分析图表的函数)

其他?

如果您不想遇到这个问题:使用不同的模块。 (见亚历山德罗的帖子。)

TL;DR:您可以在网上找到的大多数示例都假定您不是在寻找节点的直接子节点,或者相同类型的节点不在 (您正在搜索的子)树。

-> 示例可能是错误的/不足的。 RTFM ;)