2011-08-25 25 views
1

我有一个xml,我必须在其中搜索标签并用新值替换标签的值。例如,Python无需第三方库即可操作和保存XML

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

和替换oldNamenewName

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

和保存XML。我如何能做到这一点,而无需使用第三方的lib像BeautifulSoup

感谢您使用XML

回答

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') 

或者有标签名称的多次出现,和你想改变他们所有人,是否有“使用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) 
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库更快,更容易理解。

+0

谢谢柯克,哪个软件包有xmlstring? – daydreamer

+0

'xmlstring'是持有正在编辑的XML数据的字符串。 –