Python在没有第三方库的情况下操作和保存XML

时间:2011-08-25 22:25:49

标签: python xml

我有一个xml,我必须在其中搜索标记并用新值替换tag的值。例如,

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

并将oldName替换为newName,如

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

并保存xml。如果不使用像BeautifulSoup

这样的第三方库,我该怎么做呢?

谢谢

3 个答案:

答案 0 :(得分:5)

标准库中的最佳选择是(我认为)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')

或者,如果有多次出现tag-Name,并且您希望在将“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)

答案 1 :(得分:0)

Python有'内置'库用于处理xml。对于这个简单的任务,我会研究minidom。你可以在这里找到文档:

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

答案 2 :(得分: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库更快,更容易理解。