【问题标题】:How to make Pyxb not to generate xsi:type=string?如何让 Pyxb 不生成 xsi:type=string?
【发布时间】:2014-11-21 02:20:06
【问题描述】:

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

【问题讨论】:

    标签: xml pyxb


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我实际上通过在所有叶子元素中添加xsi:type="xsd:string" 解决了这个问题。然后重新生成架构。然后我可以在不传递pyxbd.string 的情况下分配字符串。我还尝试了另一种解决方案是使用xml.dom.minidom.Text,但是这些元素仍然会被视为anyType,很难访问,所以我最终使用修改后的架构并且它可以工作。
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多