为什么xml包在Python3中修改我的xml文件?

时间:2017-08-31 22:08:56

标签: xml python-3.x elementtree

我使用Python3.5中的contentType库来读取编写一个xml文件。我不修改文件。只是打开并写。但是库修改了文件。

  1. 为什么要修改?
  2. 我该怎样防止这种情况?例如我只是想在一个非常复杂的xml文件中替换特定的标签或它的值,而不会丢失任何其他信息。
  3. 这是示例文件

    xml

    这是代码

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <movie>
        <title>Der Eisbär</title>
        <ids>
            <entry>
                <key>tmdb</key>
                <value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">9321</value>
            </entry>
            <entry>
                <key>imdb</key>
                <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">tt0167132</value>
            </entry>
        </ids>
    </movie>
    

    xml文件变成了这个

    import xml.etree.ElementTree as ET
    tree = ET.parse('x.nfo')
    tree.write('y.nfo', encoding='utf-8')
    
    • 第1行已经消失。
    • 第2行中的<movie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <title>Der Eisbär</title> <ids> <entry> <key>tmdb</key> <value xsi:type="xs:int">9321</value> </entry> <entry> <key>imdb</key> <value xsi:type="xs:string">tt0167132</value> </entry> </ids> </movie> - 标记现在具有属性。
    • 第7行和第11行中的<movie> - 标记现在具有较少的属性。

1 个答案:

答案 0 :(得分:5)

请注意,“xml包”和“xml库”不明确。标准库中有几个与XML相关的模块:https://docs.python.org/3/library/xml.html

  

为什么要修改?

ElementTree将名称空间声明移动到根元素,并删除文档中实际未使用的名称空间。

为什么ElementTree会这样做?我不知道,但也许这是一种使实现更简单的方法。

  

我该怎样防止这种情况?例如我只是想在一个非常复杂的xml文件中替换特定的标签或它的值,而不会丢失任何其他信息。

我认为没有办法阻止这种情况发生。这个问题之前已经提出过。这里有两个非常相似的问题没有答案:

我的建议是使用lxml代替ElementTree。使用lxml,名称空间声明将保留在原始文件中的位置。

  

第1行已经消失。

该行是XML声明。建议但不强制要求。

如果您一直想要XML声明,请在xml_declaration=True方法调用中使用write()