6

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

   <anode>sometext</anode>

我目前有一个帮助函数getText,我用它来获取sometext上面的文本。现在我需要修改childnodes我猜的,在节点内修改具有上面显示的 XML 片段的节点,更改sometextothertext. 常见的 API 补丁getText功能如下面的脚注所示。

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

上一个问题有一个接受的答案,上面写着“我不确定您是否可以就地修改 DOM ”。这是真的吗?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 的其他地方,我看到了 2008 年接受的答案:

   node[0].firstChild.nodeValue

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

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

4

1 回答 1

6

实际上 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()
于 2012-11-27T19:37:51.387 回答