【问题标题】:How to remove ns0 tag while dumping转储时如何删除 ns0 标签
【发布时间】:2014-04-20 02:32:56
【问题描述】:

我尝试使用 lxml iterparse 解析文件,因为实际文件会很大。我有以下代码:

import xml.etree.cElementTree as etree
filename = r'D:\test\Books.xml'
context = iter(etree.iterparse(filename, events=('start', 'end')))
_, root = next(context)
for event, elem in context:
    if event == 'start' and elem.tag == '{http://www.book.org/Book-19200/biblography}Book':
        print(etree.dump(elem))
        root.clear()

我的 XML 看起来像这样:

<Books>
    <Book xmlns="http://www.book.org/Book-19200/biblography"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    ISBN="519292296"
    xsi:schemaLocation="http://www.book.org/Book-19200/biblography ../../book.xsd 
    http://www.w3.org/2000/12/xmldsig# ../../xmldsig-core-schema.xsd">
        <Detail ID="67">
            <BookName>Code Complete 2</BookName>
            <Author>Steve McConnell</Author>
            <Pages>960</Pages>
            <ISBN>0735619670</ISBN>        
            <BookName>Application Architecture Guide 2</BookName>
            <Author>Microsoft Team</Author>
            <Pages>496</Pages>
            <ISBN>073562710X</ISBN>
        </Detail>
    </Book>
    <Book xmlns="http://www.book.org/Book-19200/biblography"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    ISBN="519292296"
    xsi:schemaLocation="http://www.book.org/Book-19200/biblography ../../book.xsd 
    http://www.w3.org/2000/12/xmldsig# ../../xmldsig-core-schema.xsd">
        <Detail ID="87">
            <BookName>Rocking Python</BookName>
            <Author>Guido Rossum</Author>
            <Pages>960</Pages>
            <ISBN>0735619690</ISBN>
            <BookName>Python Rocks</BookName>
            <Author>Microsoft Team</Author>
            <Pages>496</Pages>
            <ISBN>073562710X</ISBN>
        </Detail>
    </Book>
</Books>

运行上述代码会生成如下内容:

<ns0:Book xmlns:ns0="http://www.book.org/Book-19200/biblography" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins
ance" ISBN="519292296" xsi:schemaLocation="http://www.book.org/Book-19200/biblography ../../book.xsd      http:/
www.w3.org/2000/12/xmldsig# ../../xmldsig-core-schema.xsd">
        <ns0:Detail ID="67">
            <ns0:BookName>Code Complete 2</ns0:BookName>
            <ns0:Author>Steve McConnell</ns0:Author>
            <ns0:Pages>960</ns0:Pages>
            <ns0:ISBN>0735619670</ns0:ISBN>
            <ns0:BookName>Application Architecture Guide 2</ns0:BookName>
            <ns0:Author>Microsoft Team</ns0:Author>
            <ns0:Pages>496</ns0:Pages>
            <ns0:ISBN>073562710X</ns0:ISBN>
        </ns0:Detail>
    </ns0:Book>

如何确保打印 没有 ns0 前缀的 xml 片段?我正在使用 Python 3。

【问题讨论】:

    标签: python xml python-3.x elementtree


    【解决方案1】:

    添加

    etree.register_namespace("", "http://www.book.org/Book-19200/biblography")
    

    到你的程序。这个函数注册了一个命名空间前缀用于序列化(在这种情况下它意味着没有前缀)。

    参考:http://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.register_namespace

    【讨论】:

    • 这是作为字典实现的,这很烦人 - 我碰巧有多个命名空间用于我的 xml 的不同部分(xsds 相互导入),虽然我可以将 ns0 注册为“”,我无法注册其余的只是将它们替换为字符串
    • 这引发了ValueError: Invalid tag name ''
    • @Sumit:如果您需要帮助,请提出一个新问题。
    • @mzjn 我会的。我想这是特定于内置 etree 库的,而我使用的是 lxml,所以可能就是这样。
    猜你喜欢
    • 2016-12-07
    • 2015-08-31
    • 1970-01-01
    • 2011-09-03
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多