我看到这里也有类似的问题,但没有什么能完全帮助我。
我还查看了有关名称空间的官方文档,但找不到任何真正对我有帮助的东西,也许我对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</标识符>;
<;名称>;代码</名称>;
<;参数选择/>;
<;参数setCollections/>;
<;参数/>;
<;概要一:nil=“true”/>;
<;实例>;25486d6c-36ba-4ab2-9fa6-0dbafbcf0389</实例>;
<;条件价值>;
<;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:字符串>;空码</b:字符串>;
</文本>;
</违约>;
</条件价值>;
<;类型代码>;字符串</类型代码>;
</答:条件>;
<;答:条件>;
<;a:xmlns i:nil=“true”xmlns:b=”http://schema.test.org/2004/07/System.Xml.Serialize“/>;
<;标识符>;0af860f6-5611-4a23-96dc-eb3863975529</标识符>;
<;名称>;内容类型</名称>;
<;参数选择/>;
<;参数setCollections/>;
<;参数/>;
<;概要一:nil=“true”/>;
<;实例>;6364ec20-306a-4cab-aabc-8ec65c0903c9</实例>;
<;条件价值>;
<;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:字符串>;标准</b:字符串>;
</文本>;
</违约>;
</条件价值>;
<;类型代码>;字符串</类型代码>;
</答:条件>;
</条件>;
我的工作是交换其中一个值,保留源代码的整个结构,并使用它在应用程序中稍后提交帖子
我遇到的问题是,当它保存到字符串或文件时,会完全弄乱名称空间:
<;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</ns0:标识符>;
<;ns0:Name>;代码</ns0:Name>;
<;ns0:参数选择/>;
<;ns0:ParameterSetCollections/>;
<;ns0:参数/>;
<;ns0:Summary xsi:nil=“true”/>;
<;ns0:实例>;25486d6c-36ba-4ab2-9fa6-0dbafbcf0389</ns0:实例>;
<;ns0:ConditionValue>;
<;ns0:ComplexValue xsi:nil=“true”/>;
<;ns0:Text xsi:nil=“true”/>;
<;ns0:默认值>;
<;ns0:ComplexValue xsi:nil=“true”/>;
<;ns0:Text>;
<;ns3:字符串>;空码</ns3:字符串>;
</ns0:Text>;
</ns0:默认值>;
</ns0:ConditionValue>;
<;ns0:类型代码>;字符串</ns0:类型代码>;
</ns1:条件>;
<;ns1:条件>;
<;ns1:xmlns xsi:nil=“true”/>;
<;ns0:标识符>;0af860f6-5611-4a23-96dc-eb3863975529</ns0:标识符>;
<;ns0:Name>;内容类型</ns0:Name>;
<;ns0:参数选择/>;
<;ns0:ParameterSetCollections/>;
<;ns0:参数/>;
<;ns0:Summary xsi:nil=“true”/>;
<;ns0:实例>;6364ec20-306a-4cab-aabc-8ec65c0903c9</ns0:实例>;
<;ns0:ConditionValue>;
<;ns0:ComplexValue xsi:nil=“true”/>;
<;ns0:Text xsi:nil=“true”/>;
<;ns0:默认值>;
<;ns0:ComplexValue xsi:nil=“true”/>;
<;ns0:Text>;
<;ns3:字符串>;标准</ns3:字符串>;
</ns0:Text>;
</ns0:默认值>;
</ns0:ConditionValue>;
<;ns0:类型代码>;字符串</ns0:类型代码>;
</ns1:条件>;
</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)之前,需要注册前缀和名称空间,以避免使用默认名称空间前缀(如ns0和ns1等)
例如,您可以使用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')
您可以离开<;前缀>为空
示例/演示-
>&燃气轮机&燃气轮机;r=ET.fromstring(“<;a xmlns=“blah”>;a<;/a>;”)
&燃气轮机&燃气轮机&燃气轮机;ET.tostring(右)
b'<;ns0:a xmlns:ns0=“blah”>;a</ns0:a>;'
&燃气轮机&燃气轮机&燃气轮机;ET.register_名称空间(“”,'blah')
&燃气轮机&燃气轮机&燃气轮机;r=ET.fromstring(“<;a xmlns=“blah”>;a<;/a>;”)
&燃气轮机&燃气轮机&燃气轮机;ET.tostring(右)
b'<;a xmlns=“blah”>;a</a>;'