且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用lxml从python中的xml中删除命名空间和前缀

更新时间:2023-12-03 19:03:40

按照 Uku Loskit 的建议替换标签.除此之外,使用 lxml.objectify.deannotate.

Replace tag as Uku Loskit suggests. In addition to that, use 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)

Some tags like Comment return a function when accessing tag attribute. added a guard for that. (1)