使用Python操作并保存XML而无需第三方库

1 投票
3 回答
4957 浏览
提问于 2025-04-17 00:22

我有一个 XML 文件,我需要在里面查找一个标签,并把这个标签的值替换成新的值。比如说,

<tag-Name>oldName</tag-Name>  

oldName 替换成 newName,就像这样:

<tag-Name>newName</tag-Name>    

然后保存这个 XML 文件。我该怎么做,不使用像 BeautifulSoup 这样的第三方库呢?

谢谢!

3 个回答

0

Python有一些内置的库可以用来处理xml文件。对于这个简单的任务,我建议你看看minidom这个库。你可以在这里找到相关的文档:

http://docs.python.org/library/xml.dom.minidom.html

0

如果你非常确定,也就是100%肯定字符串 <tag-Name> 永远不会出现在那个标签里面,并且XML的格式总是这样的话,你可以使用一些老办法来处理字符串,比如:

xmlstring = xmlstring.replace('<tag-Name>oldName</tag-Name>', '<tag-Name>newName</tag-Name>')

如果XML的格式不是总是像 <tag>value</tag> 这样简单方便的话,你可以写一些类似于:

a = """<tag-Name>


oldName


    </tag-Name>"""

def replacetagvalue(xmlstring, tag, oldvalue, newvalue):
    start = 0
    while True:
        try:
            start = xmlstring.index('<%s>' % tag, start) + 2 + len(tag)
        except ValueError:
            break
        end = xmlstring.index('</%s>' % tag, start)
        value = xmlstring[start:end].strip()
        if value == oldvalue:
            xmlstring = xmlstring[:start] + newvalue + xmlstring[end:]
    return xmlstring

print replacetagvalue(a, 'tag-Name', 'oldName', 'newName')

其他人已经提到过 xml.dom.minidom,这可能是一个更好的选择,特别是如果你不完全确定你的XML会这么简单。不过,如果你能保证这一点,记住XML其实就是一大块文本,你可以根据需要来处理它。

我在一些实际的代码中也用过类似的方法,比如简单的检查 if "somevalue" in htmlpage 比调用BeautifulSoup、lxml或其他*ML库要快得多,也更容易理解。

6

我认为,标准库中最好的选择是 xml.etree 这个包。

假设你的示例标签在文档中只出现一次:

import xml.etree.ElementTree as etree
# or for a faster C implementation
# import xml.etree.cElementTree as etree

tree = etree.parse('input.xml')
elem = tree.find('//tag-Name') # finds the first occurrence of element tag-Name
elem.text = 'newName'
tree.write('output.xml')

或者,如果标签名称出现多次,并且你想要把所有内容为“oldName”的标签都改掉:

import xml.etree.cElementTree as etree

tree = etree.parse('input.xml')
for elem in tree.findall('//tag-Name'):
    if elem.text == 'oldName':
        elem.text = 'newName'
# some output options for example
tree.write('output.xml', encoding='utf-8', xml_declaration=True)

撰写回答