从 XML - Python 中删除 ns0、ns1、ns2 命名空间
Remove ns0, ns1, ns2 Namespaces From XML - Python
我正在尝试使用 Python 的 lxml 库重写具有预先确定的名称空间的 XML,但我在重写时遇到了错误。我还尝试在覆盖 xml 时修改元素值,这似乎有效,但它随后附加了 ns0、ns1 和 ns2 名称空间来代替它们的预分配前缀。下面是我正在使用的代码,以及输入 XML 和我得到的输出。
import xml.etree.ElementTree at ET
import os
import lxml
import glob
path = "C:\Users\mdl518\Desktop\" # contains the input XML
def tag_rename():
for filename in glob.glob(os.path.join(path, "*.xml")):
with open(filename, 'r', encoding='utf-8'):
my_namespaces = dict([node for _, node in ET.iterparse(filename, events=['start-ns'])])
ET.register_namespace=my_namespaces
tree=ET.parse(filename)
root=tree.getroot()
for elem in root.findall('.//{http://standards.iso.org/iso/19115/-3/cit/1.0}nameIdentifier'):
elem.tag = "{http://standards.iso.org/iso/19115/-3/cit/1.0}Test"
with open(os.path.join(path, "test_rewrite.xml"), "wb") as b:
tree.write(b)
tag_rename()
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<nas:Metadata xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/1.0"
xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0"
xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0">
<gco:metadataIdentifier>
<lan:textIdentifier>
<cit:nameIdentifer>
</cit:nameIdentifier>
</lan:textIdentifier>
</gco:metadataIdentifier>
</nas:Metadata>
输出XML:
<ns0:Metadata xmlns:ns3="http://standards.iso.org/iso/19115/-3/cit/1.0"
xmlns:ns1="http://standards.iso.org/iso/19115/-3/gco/1.0"
xmlns:ns2="http://standards.iso.org/iso/19115/-3/lan/1.0">
<ns1:metadataIdentifier>
<ns2:textIdentifier>
<ns3:Test>
</ns3:Test>
</ns2:textIdentifier>
</ns1:metadataIdentifier>
</ns0:Metadata>
我尝试了多种使用 lxml 和 eTree 的方法来保留命名空间的原始前缀,但仍然无法弄清楚如何解决这个问题,非常感谢您的帮助!
我不得不对您的 xml 示例进行一些更改,包括发明一个 <root>
标签,其中包含一个伪造的 nas
命名空间声明。我还稍微修剪了脚本以处理单个文件。在那之后,这只是切换到 lxml
的情况,它比 ElementTree
具有更好的命名空间支持,并向 write 添加参数。
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<root xmlns:nas="http://this/is/not/right">
<nas:Metadata xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/1.0"
xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0"
xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0">
<gco:metadataIdentifier>
<lan:textIdentifier>
<cit:nameIdentifier>
</cit:nameIdentifier>
</lan:textIdentifier>
</gco:metadataIdentifier>
</nas:Metadata>
</root>
test.py
import lxml.etree as ET
import os
import lxml
import glob
def tag_rename(filename):
with open(filename, 'r', encoding='utf-8'):
my_namespaces = dict([node
for _, node in ET.iterparse(filename, events=['start-ns'])])
for item in my_namespaces.items():
print(item)
ET.register_namespace=my_namespaces
tree=ET.parse(filename)
root=tree.getroot()
for elem in root.findall('.//{http://standards.iso.org/iso/19115/-3/cit/1.0}nameIdentifier'):
elem.tag = "{http://standards.iso.org/iso/19115/-3/cit/1.0}Test"
with open("output.xml", "wb") as b:
tree.write(b,xml_declaration=True)
tag_rename("test.xml")
output.xml
<?xml version='1.0' encoding='ASCII'?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?><root xmlns:nas="http://this/is/not/right">
<nas:Metadata xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/1.0" xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0">
<gco:metadataIdentifier>
<lan:textIdentifier>
<cit:Test>
</cit:Test>
</lan:textIdentifier>
</gco:metadataIdentifier>
</nas:Metadata>
我正在尝试使用 Python 的 lxml 库重写具有预先确定的名称空间的 XML,但我在重写时遇到了错误。我还尝试在覆盖 xml 时修改元素值,这似乎有效,但它随后附加了 ns0、ns1 和 ns2 名称空间来代替它们的预分配前缀。下面是我正在使用的代码,以及输入 XML 和我得到的输出。
import xml.etree.ElementTree at ET
import os
import lxml
import glob
path = "C:\Users\mdl518\Desktop\" # contains the input XML
def tag_rename():
for filename in glob.glob(os.path.join(path, "*.xml")):
with open(filename, 'r', encoding='utf-8'):
my_namespaces = dict([node for _, node in ET.iterparse(filename, events=['start-ns'])])
ET.register_namespace=my_namespaces
tree=ET.parse(filename)
root=tree.getroot()
for elem in root.findall('.//{http://standards.iso.org/iso/19115/-3/cit/1.0}nameIdentifier'):
elem.tag = "{http://standards.iso.org/iso/19115/-3/cit/1.0}Test"
with open(os.path.join(path, "test_rewrite.xml"), "wb") as b:
tree.write(b)
tag_rename()
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<nas:Metadata xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/1.0"
xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0"
xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0">
<gco:metadataIdentifier>
<lan:textIdentifier>
<cit:nameIdentifer>
</cit:nameIdentifier>
</lan:textIdentifier>
</gco:metadataIdentifier>
</nas:Metadata>
输出XML:
<ns0:Metadata xmlns:ns3="http://standards.iso.org/iso/19115/-3/cit/1.0"
xmlns:ns1="http://standards.iso.org/iso/19115/-3/gco/1.0"
xmlns:ns2="http://standards.iso.org/iso/19115/-3/lan/1.0">
<ns1:metadataIdentifier>
<ns2:textIdentifier>
<ns3:Test>
</ns3:Test>
</ns2:textIdentifier>
</ns1:metadataIdentifier>
</ns0:Metadata>
我尝试了多种使用 lxml 和 eTree 的方法来保留命名空间的原始前缀,但仍然无法弄清楚如何解决这个问题,非常感谢您的帮助!
我不得不对您的 xml 示例进行一些更改,包括发明一个 <root>
标签,其中包含一个伪造的 nas
命名空间声明。我还稍微修剪了脚本以处理单个文件。在那之后,这只是切换到 lxml
的情况,它比 ElementTree
具有更好的命名空间支持,并向 write 添加参数。
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<root xmlns:nas="http://this/is/not/right">
<nas:Metadata xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/1.0"
xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0"
xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0">
<gco:metadataIdentifier>
<lan:textIdentifier>
<cit:nameIdentifier>
</cit:nameIdentifier>
</lan:textIdentifier>
</gco:metadataIdentifier>
</nas:Metadata>
</root>
test.py
import lxml.etree as ET
import os
import lxml
import glob
def tag_rename(filename):
with open(filename, 'r', encoding='utf-8'):
my_namespaces = dict([node
for _, node in ET.iterparse(filename, events=['start-ns'])])
for item in my_namespaces.items():
print(item)
ET.register_namespace=my_namespaces
tree=ET.parse(filename)
root=tree.getroot()
for elem in root.findall('.//{http://standards.iso.org/iso/19115/-3/cit/1.0}nameIdentifier'):
elem.tag = "{http://standards.iso.org/iso/19115/-3/cit/1.0}Test"
with open("output.xml", "wb") as b:
tree.write(b,xml_declaration=True)
tag_rename("test.xml")
output.xml
<?xml version='1.0' encoding='ASCII'?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?><root xmlns:nas="http://this/is/not/right">
<nas:Metadata xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/1.0" xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0">
<gco:metadataIdentifier>
<lan:textIdentifier>
<cit:Test>
</cit:Test>
</lan:textIdentifier>
</gco:metadataIdentifier>
</nas:Metadata>