如何在python中的xml.minidom中没有任何子节点的xml节点上设置文本?

时间:2012-11-28 20:12:06

标签: python xml

昨天我问过replace text on a node with children如何使用minidom。

今天我也尝试将<node/>替换为<node>text</node>

不幸的是,我觉得我的结果是一个可怕的黑客:

import xml.dom.minidom
from   xml.dom.minidom import Node

def makenode(text):
    n = xml.dom.minidom.parseString(text)
    return n.childNodes[0]

def setText(node, newText):
    if node.firstChild==None:
        str =  node.toxml();
        n = len(str)
        str = str[0:n-2]+'>'+newText+'</'+node.nodeName+'>'   #DISGUSTINGHACK!
        node.parentNode.replaceChild(  makenode(str),node )
        return
    if node.firstChild.nodeType != node.TEXT_NODE:
        raise Exception("setText: node "+node.toxml()+" does not contain text")
    node.firstChild.replaceWholeText(newText)

def test():
    olddoc = '<test><test2/></test>'
    doc=xml.dom.minidom.parseString(olddoc)
    node = doc.firstChild.firstChild  # <test2/>
    print "before:",olddoc
    setText(node,"textinsidetest2")
    newdoc =  doc.firstChild.toxml()
    print "after: ", newdoc


 #  desired result:
 # newdoc='<test><test2>textinsidetest2</test2></test>'

test()

虽然上面的代码有效,但我觉得这是一个巨大的黑客攻击。我一直在浏览xml.minidom文档,我不知道如何做以上情况,特别是 没有上面标有#DISGUSTINGHACK!的黑客。

1 个答案:

答案 0 :(得分:3)

您需要使用Document.createTextNode()创建一个Text节点,然后使用Node.appendChild()或类似的方法将其添加到所需的父节点:

def setText(doc, node, newText):
    textnode = doc.createTextNode(newText)
    node.appendChild(textnode)

为了便于使用,我在这里添加了doc参数,请使用以下方法调用:

setText(doc, node, "textinsidetest2")

您的makenode功能可以完全删除。通过这些修改,您的test()函数将打印:

before: <test><test2/></test>
after:  <test><test2>textinsidetest2</test2></test>