2014-11-21 54 views
1

我們使用PyXB生成XML文件的庫提交給我們的上游付款處理器,簡化代碼看起來像這樣如何讓pyxb不生成xsi:type = string?

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的東西?我能阻止它產生它嗎?

回答

2

沒有看到模式,無法給出確定的答案。爲了解決嵌入在WSDL文檔中的不正確模式,xsi:type可以由實例生成XML的基礎結構添加,但這不是默認設置。一個相關的情況是,當一個元素的類型爲xs:any或者具有抽象類型,但是該值與它不兼容時:在這些情況下,PyXB添加該類型以確保接收者可以解釋元素內容。

總之,最大的可能性是模式不完整,但PyXB可能是不可能的。如果您可以在自包含模式中重現問題,請file an issue on github

或者,如果不能修改架構,使元素類型確定性,你可以通過dom = instance.toDOM()生成DOM結構,然後使用操作xml.dom的它dom.documentElement.toxml('utf-8')轉換爲XML之前刪除有問題的屬性。

+0

是的,我實際上通過向所有葉元素添加'xsi:type =「xsd:string」'解決了這個問題。然後重新生成模式。然後我可以分配字符串,而不需要傳遞'pyxbd.string'。我也嘗試了另一種解決方案,就是使用'xml.dom.minidom.Text',但仍然將這些元素視爲'anyType',很難訪問,因此我最終使用修改後的模式並且它可以工作。 – 2014-11-23 05:12:56

相關問題