2016-09-14 61 views
0

我已經使用xsd.exe從http://www.gdsregistry.org/3.1/schemas/可用的模式中生成代碼。C#反序列化擴展XML複雜類型

我試圖反序列化catalogueItemNofiticationMessage(你可以在這裏找到XML:http://www.gs1.se/globalassets/artikelinformation/example-files.zip

我反序列化沒有任何大驚小怪:

var cinmSerializer = new XmlSerializer(typeof(CatalogueItemNotificationMessageType)); 
var catalogueItemNotificationMessage = cinmSerializer.Deserialize(new FileStream(path, FileMode.Open)) as CatalogueItemNotificationMessageType; 

中的文件發生會員我的問題DocumentCommandType,它不正確反序列化,我只是null。

DocumentCommandType具有在模式爲DocumentType參考:

<xsd:complexType name="DocumentCommandType"> 
    <xsd:sequence> 
     <xsd:element name="documentCommandHeader" type="gdsn_common:DocumentCommandHeaderType" /> 
     <xsd:element ref="gdsn_common:document" maxOccurs="unbounded" /> 
    </xsd:sequence> 
</xsd:complexType> 

CatalogueItemNotificationType擴展了此類型:

<xsd:complexType name="CatalogueItemNotificationType"> 
    <xsd:complexContent> 
     <xsd:extension base="shared_common:DocumentType"> 
      <xsd:sequence> 
       <xsd:element name="catalogueItemNotificationIdentification" type="shared_common:EntityIdentificationType" /> 
       <xsd:element name="isReload" type="xsd:boolean" /> 
       <xsd:element name="catalogueItem" type="catalogue_item_notification:CatalogueItemType" /> 
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

XML文件具有帶有catalogueItemNotification一個documentCommand元件。 繼承似乎是正確XSD.EXE回升,爲DocumentType具有正確的XmlIncludeAttribute:

[System.Xml.Serialization.XmlIncludeAttribute(typeof(CatalogueItemNotificationType))] 
[...] 
public abstract partial class DocumentType { 

而且CatalogueItemNotificationType類具有正確的繼承:

public partial class CatalogueItemNotificationType : DocumentType 

但仍然在反序列化XML文件字段保持爲空。

我已經嘗試將CatalogueItemNotificationType添加到XmlSerializer構造函數的extraTypes參數,以及使用XmlAttributeOverrides。

回答

0

在調試xmlserializer後找出它。

序列化程序沒有任何理解DocumentType []文檔字段可以是除基本類型DocumentType之外的任何內容。

添加下面的屬性,物業解決它:

[XmlElement("catalogueItemNotification", Type = typeof(CatalogueItemNotificationType), Namespace = "urn:gs1:gdsn:catalogue_item_notification:xsd:3")]