Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么xml包在Python3中修改我的xml文件?_Xml_Python 3.x_Elementtree - Fatal编程技术网

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

为什么xml包在Python3中修改我的xml文件?,xml,python-3.x,elementtree,Xml,Python 3.x,Elementtree,我使用Python3.5中的xml库来读写xml文件。我不修改文件。打开并写。但图书馆修改了文件 为什么要修改 我怎样才能防止这种情况?e、 我只想在一个相当复杂的xml文件中替换特定的标记或它的值,而不丢失任何其他信息 这是示例文件 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <movie> <title>Der Eisbär</title> <ids>

我使用Python3.5中的
xml
库来读写xml文件。我不修改文件。打开并写。但图书馆修改了文件

  • 为什么要修改
  • 我怎样才能防止这种情况?e、 我只想在一个相当复杂的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文件变成这样

    <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>
    
    
    德尔艾斯巴尔
    tmdb
    9321
    imdb
    tt0167132
    
    • 一号线没了
    • 第2行中的
      -标记现在具有属性
    • 第7行和第11行中的
      -标记现在具有更少的属性
    请注意,“xml包”和“xml库”是不明确的。标准库中有几个与XML相关的模块:

    为什么要修改

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

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

    我怎样才能防止这种情况?e、 我只想在一个相当复杂的xml文件中替换特定的标记或它的值,而不丢失任何其他信息

    我不认为有什么办法可以防止这种情况。这个问题以前也提过。以下是两个非常相似的问题,没有答案:

    我的建议是使用而不是ElementTree。对于lxml,名称空间声明将保留在原始文件中出现的位置

    一号线没了

    这一行是XML声明。建议但不是强制性的


    如果您总是需要XML声明,请在
    write()
    方法调用中使用
    XML\u declaration=True

    一般来说,XML名称空间的短名称(以及指定它们的位置)并不稳定。但是为什么不使用
    lxml
    呢?
    lxml
    默认情况下会保留名称空间,尽管您仍然需要传递一个标志才能将XML声明放在最上面。@o11c您是指python包
    lxml
    ?我没有注意到。我只是在python文档中使用
    xml
    作为搜索词,发现
    ElementTree
    @o11c
    lxml
    也没有帮助。它还对代码进行了一些转换,没有人试图保持属性顺序。因此,
    lxml
    所做的就是对它们进行排序。因此,即使在第一次写入时更改了它们,它们在所有后续写入时也将保持一致。
    <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>