当前位置 : 主页 > 网页制作 > xml >

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

来源:互联网 收集:自由互联 发布时间:2021-06-13
我使用 Python3.5中的xml库来读取和编写xml文件.我不修改文件.只是打开并写.但是库修改了文件. 为什么要修改? 我该如何防止这种情况?例如我只是想在一个非常复杂的xml文件中替换特定
我使用 Python3.5中的xml库来读取和编写xml文件.我不修改文件.只是打开并写.但是库修改了文件.

>为什么要修改?
>我该如何防止这种情况?例如我只是想在一个非常复杂的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>

这是代码

import xml.etree.ElementTree as ET
tree = ET.parse('x.nfo')
tree.write('y.nfo', encoding='utf-8')

而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>

>第1行消失了.
>第2行中的< movie> -tag现在具有属性.
>第7行和第11行中的< value> -tag现在具有较少的属性.

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

Why is it modified?

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

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

How can I prevent this? e.g. I just want to replace specific tag or it’s value in a quite complex xml-file without loosing any other informations.

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

> How do I parse and write XML using Python’s ElementTree without moving namespaces around?
> Keep Existing Namespaces when overwriting XML file with ElementTree and Python

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

Line 1 is gone.

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

如果您始终需要XML声明,请在write()方法调用中使用xml_declaration = True.

网友评论