小编Vik*_*aag的帖子

如何在不移动命名空间的情况下使用Python的ElementTree解析和编写XML?

我们的项目来自这种形式的上游XML:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <appSettings>
    <add key="foo" value="default">
    ...
  </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

然后它使用ElementTree读取/解析此XML,然后对于匹配某个键("foo")的每个app设置,它会写入一个新值,知道上游进程没有(在这种情况下键为"foo")应该有值"bar").

使用过滤后的XML 的下游进程是aaahhhh ...... 脆弱的.它期望接收XML中正好上面的表格.

如果我在没有注册命名空间的情况下解析这个XML,那么ElementTree就会在输入上修改我的树:

<configuration xmlns:ns0="urn:schemas-microsoft-com:asm.v1">
  <runtime>
  <ns0:assemblyBinding>
    <ns0:dependentAssembly>
      <ns0:assemblyIdentity culture="neutral" name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
      <ns0:bindingRedirect newVersion="7.0.0.0" oldVersion="0.0.0.0-6.0.0.0" />
    </ns0:dependentAssembly>
  </ns0:assemblyBinding>
 </runtime>
 <appSettings>
    <add key="foo" value="default">
    ...
 </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

下游流程无法解决这个问题,因为从语义上讲,这并不是一件容易理解的事情.所以,我决定注册我知道上游进程将提供的命名空间作为默认命名空间,以避免前缀出现在任何地方,现在我得到这个:

<configuration xmlns="urn:schemas-microsoft-com:asm.v1">
 <runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity culture="neutral" name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
      <bindingRedirect newVersion="7.0.0.0" oldVersion="0.0.0.0-6.0.0.0" /> …
Run Code Online (Sandbox Code Playgroud)

python xml nunit namespaces elementtree

6
推荐指数
1
解决办法
782
查看次数

标签 统计

elementtree ×1

namespaces ×1

nunit ×1

python ×1

xml ×1