3

私はいくつかの投稿を調べましたが、私の問題を解決する答えはまったく見つかりませんでした。

サンプルXML=

<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/>
</TextWithNodes>

だから私は通常、私がとして抽出TextWithNodesした場合、NodeList私は次のようなことをするだろうと理解しています

nodeList = TextWithNodes[0].getElementsByTagName('Node')
for a in nodeList:
    node = a.nodeValue
    print node

私が得るのはNone。書き込む必要があることを読みましたが、すべてのIDがタグを閉じa.childNodes.nodeValueているように見えるため、ノードリストに子ノードがありませんか?Node使用するa.childNodesと取得し[]ます。

ノードタイプを取得すると、aタイプ1およびTEXT_NODE=3になります。それが役立つかどうかはわかりません。

TEXT1、、などを抽出したいのですがTEXT2

4

3 に答える 3

2

lxmlドキュメントからの権利による解決策:

from lxml import etree
from StringIO import StringIO

xml = etree.parse(StringIO('''<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/></TextWithNodes>'''))

xml.xpath("//text()")
Out[43]: ['\n', 'TEXT1', 'TEXT2 ', 'TEXT3']

特定のノードのテキストを抽出することもできます。

xml.find(".//Node[@id='19']").text

ここでの問題は、XMLのテキストがどのノードにも属していないことです。

于 2012-06-20T15:26:45.107 に答える
1

タスクにはminidomの代わりにElementTreeAPIを使用する必要があります(他の回答で説明されているように)が、minidomを使用する必要がある場合は、ここに解決策があります。

探しているものがtextContent属性としてDOMレベル3に追加されました。Minidomはレベル1のみをサポートします。

ただし、この関数を使用してtextContentを非常に厳密にエミュレートできます。

def textContent(node):
    if node.nodeType in (node.TEXT_NODE, node.CDATA_SECTION_NODE):
        return node.nodeValue
    else:
        return ''.join(textContent(n) for n in node.childNodes)

その後、次のように使用できます。

x = minidom.parseString("""<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/></TextWithNodes>""")

twn = x.getElementsByTagName('TextWithNodes')[0]

assert textContent(twn) == u'\nTEXT1TEXT2 TEXT3'

親ノードのテキストコンテンツを取得した方法に注目してくださいTextWithNodes。これは、Node要素がそれらのテキストノードの兄弟であり、それらの親ではないためです。

于 2012-06-20T15:54:26.950 に答える
0

( @DiegoNavrroxml.etree.ElemetTreeが彼の回答で使用したlxmlに似ていますが、標準ライブラリの一部にetreeがあり、XPATHなどがないことを除いて)を使用すると、次のことができます。

import xml.etree.ElementTree as etree

xml_string = """<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/>
</TextWithNodes>
"""

xml_etree = etree.fromstring(xml_string)

text = [element.tail for element in xml_etree]
# `text` will be ['TEXT1', 'TEXT2 ', 'TEXT3', '\n']

これは、XML <Node id="0"/>TEXT1...が正しいことを前提としていることに注意してください。テキストは終了タグの後に続くため、タグの末尾のテキストになります。これは要素nodeValueではありません。そのため、質問のコードでNonesを取得しています。

行を。<Node id="0">TEXT1</Node>に置き換える必要があるように、XMLを解析したい場合。[element.tail for element in xml_etree][element.text for element in xml_etree]

于 2012-06-20T15:43:40.880 に答える