6

私は現在、xmlファイルをロードし、次のようにxmlタグのペア内のテキストを変更しようとしています。

   <anode>sometext</anode>

getText私は現在、上記のテキストを取得するために使用するヘルパー関数を持っていますsometext。次にchildnodes、ノード内で、上記のXMLスニペットを持つノードを変更してにsometext変更する必要がありますothertext。一般的なAPIパッチgetText関数を以下の脚注に示します。

だから私の質問は、それが私たちがテキストを取得する方法であり、どのように私はと呼ばれるコンパニオンヘルパー関数を書くのかということsetText(node,'newtext')です。それがノードレベルで動作し、すべてそれ自体で子ノードに到達し、堅牢に機能することを望んでいます。

前の質問には、「 DOMを適切に変更できるかどうかわかりません」という回答が受け入れられています。それは本当に本当ですか?Minidomは非常に壊れているので、事実上読み取り専用ですか?


脚注として、との間のテキストを読むために<anode></anode>直接の単純な単一のミニダム関数が存在しないことに驚いた。この小さなヘルパー関数がPythonxmlチュートリアルで提案されている。

import xml.dom.minidom

def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)

# I've added this bit to make usage of the above clearer
def getTextFromNode(node):
   return getText(node.childNodes)

StackOverflowの他の場所では、2008年からこの受け入れられた回答が表示されます。

   node[0].firstChild.nodeValue

それがミニダムで読むのがどれほど難しいかというと、人々が「それをしないでください!」と言うのを見て私は驚かない。XMLドキュメントのノード構造を変更する可能性のあるものを書く方法を尋ねるとき。

更新以下の答えは、思ったほど難しくないことを示しています。

4

1 に答える 1

6

実際、ミニドムは他のドムパーサーよりも使いにくいものではありません。気に入らない場合は、w3cに文句を言うことを検討してください。

from xml.dom.minidom import parseString

XML = """
<nodeA>
    <nodeB>Text hello</nodeB>
    <nodeC><noText></noText></nodeC>
</nodeA>
"""


def replaceText(node, newText):
    if node.firstChild.nodeType != node.TEXT_NODE:
        raise Exception("node does not contain text")

    node.firstChild.replaceWholeText(newText)

def main():
    doc = parseString(XML)

    node = doc.getElementsByTagName('nodeB')[0]
    replaceText(node, "Hello World")

    print doc.toxml()

    try:
        node = doc.getElementsByTagName('nodeC')[0]
        replaceText(node, "Hello World")
    except:
        print "error"


if __name__ == '__main__':
    main()
于 2012-11-27T19:37:51.387 に答える