2016-09-14 149 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")]