相关疑难解决方法(0)

使用ElementTree和Python覆盖XML文件时,保留现有命名空间

我有以下格式的XML文件

<?xml version="1.0" encoding="utf-8"?>
<foo>
   <bar>
      <bat>1</bat>
   </bar>
   <a>
      <b xmlns="urn:schemas-microsoft-com:asm.v1">
         <c>1</c>
      </b>
   </a>
</foo>
Run Code Online (Sandbox Code Playgroud)

我想将bat的值更改为“ 2”,并将文件更改为此:

<?xml version="1.0" encoding="utf-8"?>
<foo>
   <bar>
      <bat>2</bat>
   </bar>
   <a>
      <b xmlns="urn:schemas-microsoft-com:asm.v1">
         <c>1</c>
      </b>
   </a>
</foo>
Run Code Online (Sandbox Code Playgroud)

我这样做来打开这个文件

tree = ET.parse(filePath)
root = tree.getroot()
Run Code Online (Sandbox Code Playgroud)

然后,将bat的值更改为'2'并保存如下文件:

tree.write(filePath, "utf-8", True, None, "xml")
Run Code Online (Sandbox Code Playgroud)

bat的值成功更改为2,但是XML文件现在看起来像这样。

<?xml version="1.0" encoding="utf-8"?>
<foo xmlns:ns0="urn:schemas-microsoft-com:asm.v1">
   <bar>
      <bat>2</bat>
   </bar>
   <a>
      <ns0:b>
         <ns0:c>1</ns0:c>
      </ns0:b>
   </a>
</foo>
Run Code Online (Sandbox Code Playgroud)

为了解决拥有名为ns0的命名空间的问题,在解析文档之前,请执行以下操作

ET.register_namespace('', "urn:schemas-microsoft-com:asm.v1")
Run Code Online (Sandbox Code Playgroud)

这摆脱了ns0 namepace,但是xml文件现在看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<foo xmlns="urn:schemas-microsoft-com:asm.v1">
   <bar>
      <bat>2</bat>
   </bar>
   <a>
      <b>
         <c>1</c>
      </b>
   </a>
</foo>
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能获得所需的输出?

python xml elementtree

5
推荐指数
1
解决办法
1181
查看次数

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

我使用xmlPython3.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>
Run Code Online (Sandbox Code Playgroud)

这是代码

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

而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>
Run Code Online (Sandbox Code Playgroud)
  • 1号线消失了.
  • <movie>2行中的-tag现在具有属性.
  • <value>7行和第11行中的-tag现在具有较少的属性.

xml elementtree python-3.x

5
推荐指数
1
解决办法
284
查看次数

标签 统计

elementtree ×2

xml ×2

python ×1

python-3.x ×1