【问题标题】:Python minidom/xml : How to set node text with minidom apiPython minidom/xml:如何使用 minidom api 设置节点文本
【发布时间】:2026-01-25 16:35:02
【问题描述】:

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

   <anode>sometext</anode>

我目前有一个名为 getText 的辅助函数,用于获取上面的文本 sometext。现在我需要修改childnodes 我猜,在节点内部修改一个具有上面显示的XML sn-p 的节点,将sometext 更改为othertext。常见的 API 补丁 getText 函数如下面的脚注所示。

所以我的问题是,这就是我们获取文本的方式,我该如何编写一个名为 setText(node,'newtext') 的配套辅助函数。如果它在节点级别上运行,我更喜欢它自己找到通往子节点的方式,并且运行良好。

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


作为脚注,要阅读&lt;anode&gt;&lt;/anode&gt; 之间的文本,我很惊讶不存在直接简单的单个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)

Elsewhere 在 * 中,我看到了 2008 年接受的答案:

   node[0].firstChild.nodeValue

如果这就是使用 minidom 阅读的难度,那么看到人们说“不要这样做!”我并不感到惊讶。当您询问如何编写可能会修改 XML 文档的节点结构的内容时。

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

【问题讨论】:

    标签: python xml


    【解决方案1】:

    其实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()
    

    【讨论】:

    • 我只是想了解为什么每个人都说“使用其他东西”。如果它是 W3C 定义的标准 API,那么这是学习它的好理由!
    • W3C 标准最初是在十多年前创建的,它必须适用于许多不同的语言和编程范式。 DOM 是一个共同点,并且被大大简化了。在python这种动态语言中,你可以做得比DOM API好
    • 我想 Python 是正交敏感 api 的领地,它背负着我所见过的用于这项任务的最不正交、最不明智的 API。哦,Python 是一种正确的方法,它有十亿个 XML api。 :-)
    • 但是,我在抱怨图书馆丰富的生态系统。用这种语言有一种正确的方法。图书馆将是复数形式。美好的。 2016 年的我认为 2012 年的我错了。
    • 这取决于你想要做什么。如果您希望对 XML 本身进行非常可控的操作,那么 dom 是正确的选择。如果您想了解文档中的内容而 XML 只是一种编码,请考虑 elementtree