如何让Pyxb不生成xsi:type = string?

时间:2014-11-21 02:20:06

标签: xml pyxb

我们有一个使用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的东西?我可以阻止它产生吗?

1 个答案:

答案 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')