我们的项目来自这种形式的上游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)