我目前正在尝试加载xml文件并修改一对xml标记内的文本,如下所示:

   <anode>sometext</anode>

我目前有一个名为getText的帮助程序函数,用于获取上面的文本sometext。现在,我需要在节点内部修改childnodes,以修改具有上面显示的XML代码段的节点,以将sometext更改为othertext。脚注中显示了常见的API修补程序getText函数。

所以我的问题是,这就是我们如何获取文本,如何编写名为setText(node,'newtext')的辅助助手函数。我更希望它在节点级别上运行,并自行找到所有子节点,并且运行稳定。

上一个问题的答案为“I'm not sure you can modify the DOM in place”。真的是这样吗? Minidom如此破损以至于它实际上是只读的吗?

通过脚注,要读取<anode></anode>之间的文本,我感到惊讶的是,不存在直接的简单单个minidom函数,并且在Python xml教程中建议了这个小的辅助函数:
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中的Elsewhere中,我看到了这个从2008年开始接受的答案:
   node[0].firstChild.nodeValue

如果那是最小的阅读困难,那么我不惊奇地看到人们说“只是不要这样做!”当您询问如何编写可能会修改XML文档的Node结构的内容时。

更新以下答案表明它并不像我想的那么难。

最佳答案

实际上,minidom并不比其他dom解析器更难使用,如果您不喜欢它,则可能要考虑向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()

关于Python minidom/xml : How to set node text with minidom api,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13588072/

10-12 22:48