【问题标题】:Python XML: get direct child nodesPython XML:获取直接子节点
【发布时间】:2012-08-04 02:49:51
【问题描述】:

我有一个如下所示的 xml。我想获取Node1下的所有直接子节点。我正在尝试使用 childNodes,但是,它也返回 Node21 和 Node22。我怎样才能得到那些直接的子节点

<Node1>
  <Node11>
    <Node21>
    </Node21>
    <Node22>
    </Node22>
    <Node23>
    </Node23>
  </Node11>
  <Node12>
  </Node12>
  <Node13>
  </Node13>
</Node1>

更新 对困惑感到抱歉。我犯了一个错误,似乎它只获取直接子节点。但是,item number is the childnodes 仍然超过了真正的子节点。我尝试获取节点名称。我得到了很多“#text”

【问题讨论】:

  • 我的测试并没有显示使用 xml.dom 会发生这种情况(我假设这就是您正在使用的?)。您可以发布您的代码示例吗?

标签: python xml


【解决方案1】:

xml.ElementTree.Element支持迭代器协议,所以可以使用list(elem)如下:

import xml.etree.cElementTree as ET

s = '''
<Node1>
  <Node11>
    <Node21>
    </Node21>
    <Node22>
    </Node22>
    <Node23>
    </Node23>
  </Node11>
  <Node12>
  </Node12>
  <Node13>
  </Node13>
</Node1>
'''

root = ET.fromstring(s)

print root
print list(root)

【讨论】:

  • 另外,您可以在for 循环中直接遍历子元素对象,而无需将其包装到list()
  • @pepr:是的。更一般地说,Element 支持迭代器协议。我会澄清答案
【解决方案2】:

有两种方法可以处理文本节点。如果你真的想继续使用 dom,你可以用过滤器去掉文本节点:

>>> filter(lambda node: node.nodeType != xml.dom.Node.TEXT_NODE, myNode.childNodes)
[<DOM Element: Node11 at 0x18e64d0>, <DOM Element: Node12 at 0x18e6950>, <DOM Element: Node13 at 0x18e6a70>]

或列表推导:

>>> [x for x in myNode.childNodes if x.nodeType != xml.dom.Node.TEXT_NODE]
[<DOM Element: Node11 at 0x18e64d0>, <DOM Element: Node12 at 0x18e6950>, <DOM Element: Node13 at 0x18e6a70>]

如果您不需要继续使用 dom,我建议您按照 Eli Bendersky 的建议使用 ElementTree。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多