Py学习  »  Python

python:用elementtree解析xml并用名称空间编写

Alesa • 7 年前 • 1892 次点击  

我用 xml python3.5中的库 阅读 和 写作 XML文件。我不修改文件。打开写就行了。但是图书馆修改了文件。

  1. 为什么要修改?
  2. 我怎样才能防止这种情况?例如,我只想替换一个非常复杂的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>
  • 一号线不见了。
  • 这个 <movie> -第2行中的标记现在具有属性。
  • 这个 <value> -第7行和第11行中的标记现在具有较少的属性。
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43012
文章 [ 1 ]  |  最新文章 7 年前
mzjn
Reply   •   1 楼
mzjn    9 年前

注意“xml包”和“ xml “图书馆”是模棱两可的。标准库中有几个与xml相关的模块: https://docs.python.org/3/library/xml.html .

为什么要修改?

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

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

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

我不认为有什么办法可以阻止这一切。这个问题以前就提过。这里有两个非常相似的问题,没有答案:

我的建议是 lxml 而不是元素树。使用lxml,命名空间声明将保留在原始文件中出现的位置。

一号线不见了。

那一行是xml声明。建议但不是强制性的。

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