我有一个需要打开并进行一些更改的xml文件,其中之一是删除名称空间和前缀,然后保存到另一个文件。这是xml:
<?xml version='1.0' encoding='UTF-8'?> <package xmlns="http://apple.com/itunes/importer"> <provider>some data</provider> <language>en-GB</language> </package>
我可以进行所需的其他更改,但是找不到如何删除名称空间和前缀的方法。这是我需要的reusklt xml:
<?xml version='1.0' encoding='UTF-8'?> <package> <provider>some data</provider> <language>en-GB</language> </package>
这是我的脚本,它将打开并解析xml并将其保存:
metadata = '/Users/user1/Desktop/Python/metadata.xml' from lxml import etree parser = etree.XMLParser(remove_blank_text=True) open(metadata) tree = etree.parse(metadata, parser) root = tree.getroot() tree.write('/Users/user1/Desktop/Python/done.xml', pretty_print = True, xml_declaration = True, encoding = 'UTF-8')
那么,如何在脚本中添加代码以删除名称空间和前缀呢?
按照Uku Loskit的建议替换标签。除此之外,请使用lxml.objectify.deannotate。
from lxml import etree, objectify metadata = '/Users/user1/Desktop/Python/metadata.xml' parser = etree.XMLParser(remove_blank_text=True) tree = etree.parse(metadata, parser) root = tree.getroot() #### for elem in root.getiterator(): if not hasattr(elem.tag, 'find'): continue # (1) i = elem.tag.find('}') if i >= 0: elem.tag = elem.tag[i+1:] objectify.deannotate(root, cleanup_namespaces=True) #### tree.write('/Users/user1/Desktop/Python/done.xml', pretty_print=True, xml_declaration=True, encoding='UTF-8')
更新
一些标签,例如Comment访问tag属性时返回一个函数。为此增加了一个警卫。(1)
Comment
tag