1

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

4

1 回答 1

2

如果没有看到架构,就无法给出明确的答案。xsi:type 可以由从实例生成 XML 的基础结构添加,以解决嵌入在 WSDL 文档中的不正确模式,但这不是默认设置。一个相关的情况是当元素具有类型 xs:any 或具有抽象类型但值与其不兼容时:在这些情况下,PyXB 添加类型以确保接收者可以解释元素内容。

简而言之,模式不完整的可能性最高,但 PyXB 可能是迟钝的。如果您可以在自包含模式中重现问题,请在 github 上提出问题

或者,如果您无法修改架构以使元素类型具有确定性,您可以生成一个 DOM 结构,dom = instance.toDOM()然后使用 xml.dom 操作删除有问题的属性,然后再使用dom.documentElement.toxml('utf-8').

于 2014-11-23T04:00:54.407 回答