我们有一个使用PyXB的库来生成XML文件以提交给我们的上游支付处理器,简化代码如下所示
import pyxb.binding.datatypes as pyxbd
from . import schema
record = schema.Record(
Arg1='xxx',
Arg2='xxx',
)
record.Foo = pyxbd.string('bar')
print record.toDOM()
生成的XML文档将如下所示
<?xml version="1.0" encoding="utf-8"?>
<Record Arg1="xxx" Arg2="xxx"
xmlns:ns1="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<Foo xsi:type="ns1:string">Bar</Foo>
<Record>
不知道为什么,但我们的上游处理器不喜欢任何元素的xsi:type="ns1:string"
属性,所以它拒绝我们的请求。我的问题是为什么pyxb架构生成这个xsi:type
的东西?我可以阻止它产生吗?
答案 0 :(得分:2)
如果没有看到架构,就无法给出明确的答案。 xsi:type可以由从实例生成XML的基础结构添加,以解决嵌入在WSDL文档中的不正确模式,但这不是默认模式。一个相关的例子是当一个元素的类型为xs:any或者有一个抽象类型但是它与它不相容时:在那些情况下,PyXB添加了类型以确保接收者可以解释元素内容。
简而言之,最高概率是模式不完整,但可能PyXB是钝的。如果您可以在自包含架构中重现问题,请file an issue on github。
或者,如果您无法修改模式以使元素类型具有确定性,则可以通过dom = instance.toDOM()
生成DOM结构,然后使用xml.dom操作删除违规属性,然后再将其转换为XML dom.documentElement.toxml('utf-8')
。