我有一个像下面的xml。我想获得Node1下的所有直接子节点。我试图使用childNodes,但它也返回Node21和Node22。我怎样才能获得那些直接的chirld节点
<Node1>
<Node11>
<Node21>
</Node21>
<Node22>
</Node22>
<Node23>
</Node23>
</Node11>
<Node12>
</Node12>
<Node13>
</Node13>
</Node1>
更新 对困惑感到抱歉。我犯了一个错误,似乎只能得到直接的子节点。但是,项目编号是子节点仍然超过真实的子节点。我尝试获取nodeName。我得到了很多“#text”
答案 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建议的那样。