2010-06-14 1 views
0

J'ai une XSD et une classe générée par XSD.EXE que j'utilise pour désérialiser un document XML. Pour une raison quelconque, un nœud assez profondément dans le document XML ne parvient pas à désérialiser, et je ne trouve pas pourquoi il ferait si ...C# XML Deserializer ne parvient pas à désérialiser le nœud enfant

Voici comment je suis désérialisation:

XmlSchema schema = XmlSchema.Read(XmlReader.Create("X12_00401_271.xsd"), null); 
XmlSerializer _xSerializer = new XmlSerializer(typeof(X12_00401_271)); 
using (XmlReader _xReader = XmlReader.Create(path)) 
{ 
    _xResponse = _xSerializer.Deserialize(_xReader) as X12_00401_271; 
} 

la partie pertinente de la XSD ressemble à:

<xs:element name="TS271A1_2110C_Loop"> 
<xs:annotation> 
    <xs:appinfo> 
    <b:recordInfo structure="delimited" delimiter_type="inherit_record" 
    field_order="infix" count_ignore="yes" child_delimiter="default" 
    trigger_field="EB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110C/EB01__EligibilityOrBenefitInformation" 
    trigger_value="1 2 3 4 5 6 7 8 A B C D E F G H I J K L M N O P Q R S T U V W X Y MC CB" 
    notes="Subscriber Eligibility or Benefit Information" /> 
    </xs:appinfo> 
</xs:annotation> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element minOccurs="1" maxOccurs="1" ref="EB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110C" /> 
    <xs:element minOccurs="0" maxOccurs="9" ref="HSD_HealthCareServicesDelivery_TS271A1_2110C" /> 
    <xs:element minOccurs="0" maxOccurs="9" ref="REF_SubscriberAdditionalIdentification_TS271A1_2110C" /> 
    <xs:element minOccurs="0" maxOccurs="20" ref="DTP_SubscriberEligibilityBenefitDate_TS271A1_2110C" /> 
    <xs:element minOccurs="0" maxOccurs="9" ref="AAA_SubscriberRequestValidation_TS271A1_2110C" /> 
    <xs:element minOccurs="0" maxOccurs="10" ref="MSG_MessageText_TS271A1_2110C" /> 
    <xs:element minOccurs="0" maxOccurs="10" ref="TS271A1_2115C_Loop" /> 
    <xs:element minOccurs="0" name="LSLoop_2110C"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element minOccurs="1" maxOccurs="1" ref="LS_Header_TS271A1_2110C" /> 
      <xs:element minOccurs="0" maxOccurs="1" ref="TS271A1_2120C_Loop" /> 
      <xs:element minOccurs="1" maxOccurs="1" ref="LE_Trailer_TS271A1_2110C" /> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

Où LS_Header_TS271A1_2110C 'thru 'LE_Trailer_TS271A_2110C' ne parviennent pas à désérialiser

Ces trois extraits sont:

<xs:element name="LS_Header_TS271A1_2110C"> 
<xs:annotation> 
    <xs:appinfo> 
    <b:recordInfo tag_name="LS_Header_TS271A1_2110C" structure="delimited" 
    delimiter_type="inherit_field" field_order="prefix" count_ignore="no" 
    child_delimiter="default" notes="Loop Header" /> 
    </xs:appinfo> 
</xs:annotation> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="LS01__LoopIdentifierCode"> 
     <xs:annotation> 
     <xs:appinfo> 
      <b:fieldInfo edi_datatype="AN" justification="left"> 
      </b:fieldInfo> 
     </xs:appinfo> 
     </xs:annotation> 
     <xs:simpleType> 
     <xs:restriction base="X12_AN"> 
      <xs:minLength value="1" /> 
      <xs:maxLength value="6" /> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:element name="TS271A1_2120C_Loop"> 
<xs:annotation> 
    <xs:appinfo> 
    <b:recordInfo structure="delimited" delimiter_type="inherit_record" field_order="infix" 
    count_ignore="yes" child_delimiter="default" 
    trigger_field="NM1_SubscriberBenefitRelatedEntityName_TS271A1_2120C/NM101__EntityIdentifierCode" trigger_value="13 1P 2B 36 73 FA GP IL LR P3 P4 P5 PR SEP TTP VN X3 PRP" 
    notes="Subscriber Benefit Related Entity Name" /> 
    </xs:appinfo> 
</xs:annotation> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element minOccurs="1" maxOccurs="1" ref="NM1_SubscriberBenefitRelatedEntityName_TS271A1_2120C" /> 
    <xs:element minOccurs="0" maxOccurs="1" ref="N3_SubscriberBenefitRelatedEntityAddress_TS271A1_2120C" /> 
    <xs:element minOccurs="0" maxOccurs="1" ref="N4_SubscriberBenefitRelatedCityStateZIPCode_TS271A1_2120C" /> 
    <xs:element minOccurs="0" maxOccurs="3" ref="PER_SubscriberBenefitRelatedEntityContactInformation_TS271A1_2120C" /> 
    <xs:element minOccurs="0" maxOccurs="1" ref="PRV_SubscriberBenefitRelatedProviderInformation_TS271A1_2120C" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:element name="LE_Trailer_TS271A1_2110C"> 
<xs:annotation> 
    <xs:appinfo> 
    <b:recordInfo tag_name="LE_Trailer_TS271A1_2110C" structure="delimited" 
    delimiter_type="inherit_field" field_order="prefix" count_ignore="no" 
    child_delimiter="default" notes="Loop Trailer" /> 
    </xs:appinfo> 
</xs:annotation> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="LE01__LoopIdentifierCode"> 
     <xs:annotation> 
     <xs:appinfo> 
      <b:fieldInfo edi_datatype="AN" justification="left"> 
      </b:fieldInfo> 
     </xs:appinfo> 
     </xs:annotation> 
     <xs:simpleType> 
     <xs:restriction base="X12_AN"> 
      <xs:minLength value="1" /> 
      <xs:maxLength value="6" /> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

La classe générée pour la dernière boucle est correcte:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 

[System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute ("code")] [System.Xml.Serialization.XmlTypeAttribute (AnonymousType = true, espace de noms = "http://schemas.microsoft.com/BizTalk/EDI/X12/2006")] [System.Xml.Serialization.XmlRootAttribute (Namespace = "http://schemas.microsoft.com/BizTalk/EDI/X12/2006" , IsNullable = false)] public partial class TS271A1_2110C_Loop {

private EB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110C eB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110CField; 

private HSD_HealthCareServicesDelivery_TS271A1_2110C[] hSD_HealthCareServicesDelivery_TS271A1_2110CField; 

private REF_SubscriberAdditionalIdentification_TS271A1_2110C[] rEF_SubscriberAdditionalIdentification_TS271A1_2110CField; 

private DTP_SubscriberEligibilityBenefitDate_TS271A1_2110C[] dTP_SubscriberEligibilityBenefitDate_TS271A1_2110CField; 

private AAA_SubscriberRequestValidation_TS271A1_2110C[] aAA_SubscriberRequestValidation_TS271A1_2110CField; 

private MSG_MessageText_TS271A1_2110C[] mSG_MessageText_TS271A1_2110CField; 

private TS271A1_2115C_Loop[] tS271A1_2115C_LoopField; 

private TS271A1_2110C_LoopLSLoop lSLoopField; 

/// <remarks/> 
public EB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110C EB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110C { 
    get { 
     return this.eB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110CField; 
    } 
    set { 
     this.eB_SubscriberEligibilityOrBenefitInformation_TS271A1_2110CField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("HSD_HealthCareServicesDelivery_TS271A1_2110C")] 
public HSD_HealthCareServicesDelivery_TS271A1_2110C[] HSD_HealthCareServicesDelivery_TS271A1_2110C { 
    get { 
     return this.hSD_HealthCareServicesDelivery_TS271A1_2110CField; 
    } 
    set { 
     this.hSD_HealthCareServicesDelivery_TS271A1_2110CField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("REF_SubscriberAdditionalIdentification_TS271A1_2110C")] 
public REF_SubscriberAdditionalIdentification_TS271A1_2110C[] REF_SubscriberAdditionalIdentification_TS271A1_2110C { 
    get { 
     return this.rEF_SubscriberAdditionalIdentification_TS271A1_2110CField; 
    } 
    set { 
     this.rEF_SubscriberAdditionalIdentification_TS271A1_2110CField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("DTP_SubscriberEligibilityBenefitDate_TS271A1_2110C")] 
public DTP_SubscriberEligibilityBenefitDate_TS271A1_2110C[] DTP_SubscriberEligibilityBenefitDate_TS271A1_2110C { 
    get { 
     return this.dTP_SubscriberEligibilityBenefitDate_TS271A1_2110CField; 
    } 
    set { 
     this.dTP_SubscriberEligibilityBenefitDate_TS271A1_2110CField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("AAA_SubscriberRequestValidation_TS271A1_2110C")] 
public AAA_SubscriberRequestValidation_TS271A1_2110C[] AAA_SubscriberRequestValidation_TS271A1_2110C { 
    get { 
     return this.aAA_SubscriberRequestValidation_TS271A1_2110CField; 
    } 
    set { 
     this.aAA_SubscriberRequestValidation_TS271A1_2110CField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("MSG_MessageText_TS271A1_2110C")] 
public MSG_MessageText_TS271A1_2110C[] MSG_MessageText_TS271A1_2110C { 
    get { 
     return this.mSG_MessageText_TS271A1_2110CField; 
    } 
    set { 
     this.mSG_MessageText_TS271A1_2110CField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("TS271A1_2115C_Loop")] 
public TS271A1_2115C_Loop[] TS271A1_2115C_Loop { 
    get { 
     return this.tS271A1_2115C_LoopField; 
    } 
    set { 
     this.tS271A1_2115C_LoopField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public TS271A1_2110C_LoopLSLoop LSLoop { 
    get { 
     return this.lSLoopField; 
    } 
    set { 
     this.lSLoopField = value; 
    } 
} 

}

Pour ceux qui sont familiers avec la norme, il s'agit spécifiquement d'un HIPAA 271 et je n'arrive pas à désérialiser la boucle 2120C. Pour le reste d'entre vous, je ne pense pas que cela compte pour le problème spécifique ...

J'ai vérifié que le nœud dont j'ai besoin existe à la fois dans le XSD et dans le fichier XML que je suis en train d'analyser. Des suggestions sur où regarder ensuite?

+0

Lorsque vous dites qu'il ne parvient pas à désérialiser, obtenez-vous une exception, ou l'objet est-il juste NULL lorsque la désérialisation est terminée? De même, comment le code source XML a-t-il été généré? – Toby

+0

Pourriez-vous coller le lien (ou) le texte à votre xsd et la classe générée pour ChildNode4 (le dernier nœud correctement désérialisé)? – Grzenio

+0

@Toby: L'objet est nul lorsque la désérialisation est terminée. J'ai utilisé XSD.EXE @Grzenio: C'est un long morceau de XSD, je vais essayer d'ajouter dans les extraits pertinents. – AllenG

Répondre

1

J'ai déjà rencontré ça. D'après ce que je peux voir, XmlSerializer ne supporte pas les espaces de noms sur les nœuds enfants. Vous devez définir explicitement leur espace de noms à "" (en utilisant xmlns = "" ou similaire).

+0

Ceci est la meilleure réponse, il aurait aidé si vous avez spécifié exactement ce que vous vouliez dire, mais cela a fonctionné, merci mec. – user1494173

Questions connexes