Python XML:获取直接子节点

时间:2012-08-07 05:54:39

标签: python xml

我有一个像下面的xml。我想获得Node1下的所有直接子节点。我试图使用childNodes,但它也返回Node21和Node22。我怎样才能获得那些直接的chirld节点

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

更新 对困惑感到抱歉。我犯了一个错误,似乎只能得到直接的子节点。但是,项目编号是子节点仍然超过真实的子节点。我尝试获取nodeName。我得到了很多“#text”

2 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:1)

有两种方法可以处理文本节点。如果你真的想继续使用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,我建议使用ElementTree,就像Eli Bendersky建议的那样。