2

我有一个如下所示的 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”

4

2 回答 2

4

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)
于 2012-08-07T06:02:15.243 回答
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,我建议您按照 Eli Bendersky 的建议使用 ElementTree。

于 2012-08-07T07:39:20.477 回答