在Python中使用ETree保存XML。它没有保留名称空间,也没有添加ns0、ns1和删除xmlns标记

我看到这里也有类似的问题,但没有什么能完全帮助我。
我还查看了有关名称空间的官方文档,但找不到任何真正对我有帮助的东西,也许我对XML格式太陌生了。
我知道也许我需要创建自己的名称空间字典?不管怎样,我的情况如下:

我从一个API调用中得到一个结果,它给了我一个XML,它作为字符串存储在我的Python应用程序中

我要做的就是获取这个XML,交换出一个很小的值(b:string值user ConditionValue/Default,但这与这个问题无关)
然后将其另存为字符串,以便稍后在Rest POST调用中发送

源XML如下所示:

<上下文xmlns=”http://Test.the.Sdk/2010/07“xmlns:i=”http://www.w3.org/2001/XMLSchema-instance“>
<xmlns i:nil=“true”xmlns=”http://schema.test.org/2004/07/Test.Soa.Vocab“xmlns:a=”http://schema.test.org/2004/07/System.Xml.Serialize“/>
<条件xmlns:a=”http://schema.test.org/2004/07/Test.Soa.Vocab“>
<答:条件>
<a:xmlns i:nil=“true”xmlns:b=”http://schema.test.org/2004/07/System.Xml.Serialize“/>
<标识符>A23ACAF-9b6b-424f-92bb-5ab71505e3bc&lt/标识符>
<名称>代码&lt/名称>
<参数选择/>
<参数setCollections/>
<参数/>
<概要一:nil=“true”/>
<实例>25486d6c-36ba-4ab2-9fa6-0dbafbcf0389&lt/实例>
<条件价值>
<ComplexValue i:nil=“true”/>
<Text i:nil=“true”xmlns:b=”http://schemas.microsoft.com/2003/10/Serialization/Arrays“/>
<违约>
<ComplexValue i:nil=“true”/>
<文本xmlns:b=”http://schemas.microsoft.com/2003/10/Serialization/Arrays“>
<b:字符串>空码&lt/b:字符串>
&lt/文本>
&lt/违约>
&lt/条件价值>
<类型代码>字符串&lt/类型代码>
&lt/答:条件>
<答:条件>
<a:xmlns i:nil=“true”xmlns:b=”http://schema.test.org/2004/07/System.Xml.Serialize“/>
<标识符>0af860f6-5611-4a23-96dc-eb3863975529&lt/标识符>
<名称>内容类型&lt/名称>
<参数选择/>
<参数setCollections/>
<参数/>
<概要一:nil=“true”/>
<实例>6364ec20-306a-4cab-aabc-8ec65c0903c9&lt/实例>
<条件价值>
<ComplexValue i:nil=“true”/>
<Text i:nil=“true”xmlns:b=”http://schemas.microsoft.com/2003/10/Serialization/Arrays“/>
<违约>
<ComplexValue i:nil=“true”/>
<文本xmlns:b=”http://schemas.microsoft.com/2003/10/Serialization/Arrays“>
<b:字符串>标准&lt/b:字符串>
&lt/文本>
&lt/违约>
&lt/条件价值>
<类型代码>字符串&lt/类型代码>
&lt/答:条件>
&lt/条件>

我的工作是交换其中一个值,保留源代码的整个结构,并使用它在应用程序中稍后提交帖子

我遇到的问题是,当它保存到字符串或文件时,会完全弄乱名称空间:

<ns0:Context xmlns:ns0=”http://Test.the.Sdk/2010/07“xmlns:ns1=”http://schema.test.org/2004/07/Test.Soa.Vocab“xmlns:ns3=”http://schemas.microsoft.com/2003/10/Serialization/Arrays“xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“>
<ns1:xmlns xsi:nil=“true”/>
<ns0:条件>
<ns1:条件>
<ns1:xmlns xsi:nil=“true”/>
<ns0:标识符>A23ACAF-9b6b-424f-92bb-5ab71505e3bc&lt/ns0:标识符>
<ns0:Name>代码&lt/ns0:Name>
<ns0:参数选择/>
<ns0:ParameterSetCollections/>
<ns0:参数/>
<ns0:Summary xsi:nil=“true”/>
<ns0:实例>25486d6c-36ba-4ab2-9fa6-0dbafbcf0389&lt/ns0:实例>
<ns0:ConditionValue>
<ns0:ComplexValue xsi:nil=“true”/>
<ns0:Text xsi:nil=“true”/>
<ns0:默认值>
<ns0:ComplexValue xsi:nil=“true”/>
<ns0:Text>
<ns3:字符串>空码&lt/ns3:字符串>
&lt/ns0:Text>
&lt/ns0:默认值>
&lt/ns0:ConditionValue>
<ns0:类型代码>字符串&lt/ns0:类型代码>
&lt/ns1:条件>
<ns1:条件>
<ns1:xmlns xsi:nil=“true”/>
<ns0:标识符>0af860f6-5611-4a23-96dc-eb3863975529&lt/ns0:标识符>
<ns0:Name>内容类型&lt/ns0:Name>
<ns0:参数选择/>
<ns0:ParameterSetCollections/>
<ns0:参数/>
<ns0:Summary xsi:nil=“true”/>
<ns0:实例>6364ec20-306a-4cab-aabc-8ec65c0903c9&lt/ns0:实例>
<ns0:ConditionValue>
<ns0:ComplexValue xsi:nil=“true”/>
<ns0:Text xsi:nil=“true”/>
<ns0:默认值>
<ns0:ComplexValue xsi:nil=“true”/>
<ns0:Text>
<ns3:字符串>标准&lt/ns3:字符串>
&lt/ns0:Text>
&lt/ns0:默认值>
&lt/ns0:ConditionValue>
<ns0:类型代码>字符串&lt/ns0:类型代码>
&lt/ns1:条件>
&lt/ns0:条件>

我已经将代码缩小到最基本的形式,并且仍然得到相同的结果,因此这与我如何正常操作文件无关:

将xml.etree.ElementTree作为ET导入
导入请求
获取上下文http://localhost/testapi/returnxml“#返回上面的第一个XML示例。
source\u context\u xml=requests.get(get\u context\u xml)
Tree=ET.fromstring(源\上下文\ xml)
#确保原始名称空间完好无损。
对于Tree.iter中的条件:{http://schema.test.org/2004/07/Test.Soa.Vocab}条件“):
打印“成功”
将open('/home/memyself/output.xml',w')作为f:
f、 写入(ET.tostring(Tree))

在执行fromstring()(读取xml)之前,需要注册前缀和名称空间,以避免使用默认名称空间前缀(如ns0ns1等)

例如,您可以使用ET.register\u namespace()函数进行此操作-

ET.register\u名称空间(“<prefix>”,”http://Test.the.Sdk/2010/07')
ET.register_名称空间('a','http://schema.test.org/2004/07/Test.Soa.Vocab')

您可以离开<前缀&gt为空


示例/演示-

&gt&燃气轮机&燃气轮机;r=ET.fromstring(“<a xmlns=“blah”>a</a>”)
&燃气轮机&燃气轮机&燃气轮机;ET.tostring(右)
b'<ns0:a xmlns:ns0=“blah”>a&lt/ns0:a>'
&燃气轮机&燃气轮机&燃气轮机;ET.register_名称空间(“”,'blah')
&燃气轮机&燃气轮机&燃气轮机;r=ET.fromstring(“<a xmlns=“blah”>a</a>”)
&燃气轮机&燃气轮机&燃气轮机;ET.tostring(右)
b'<a xmlns=“blah”>a&lt/a>'

发表评论