2

私は以下のようなxmlを持っています。Node1の下にあるすべての直接の子ノードを取得したいと思います。childNodesを使用しようとしていますが、Node21とNode22も返します。どうすればそれらの直接チャードノードを取得できますか

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

更新 混乱してすみません。間違えました。直接の子ノードしか取得できないようです。ただし、アイテム番号は子ノードが実際の子ノードを超えていることです。nodeNameを取得しようとしています。「#text」がたくさん出ます

4

2 に答える 2

4

xml.ElementTree.Elementlist(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

テキストノードの処理には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を使い続ける必要がない場合は、EliBenderskyが提案したようにElementTreeを使用することをお勧めします。

于 2012-08-07T07:39:20.477 に答える