首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XML - Python中删除ns0、ns1、ns2命名空间

从XML - Python中删除ns0、ns1、ns2命名空间
EN

Stack Overflow用户
提问于 2020-06-24 06:17:19
回答 1查看 835关注 0票数 2

我正在尝试使用Python的lxml库重写具有预先确定的名称空间的XML,但在重写时遇到了一个bug。我还试图在覆盖xml时修改一个元素值,这似乎是可行的,但它随后会附加ns0、ns1和ns2名称空间,而不是它们预先分配的前缀。下面是我使用的代码,以及我得到的输入XML和输出。

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<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来保留名称空间的原始前缀,但仍然不知道如何解决这个问题,任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-24 07:06:22

我不得不对您的xml示例做了一些修改,包括发明了一个包含假nas名称空间声明的<root>标记。我还对脚本进行了一些修改,以处理单个文件。在那之后,只需要切换到比ElementTree具有更好的命名空间支持的lxml,并在写操作中添加一个参数。

test.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62544576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档