代码之家  ›  专栏  ›  技术社区  ›  AllenG

C XML反序列化程序未能反序列化子节点

  •  0
  • AllenG  · 技术社区  · 14 年前

    我有一个xsd和一个由xsd.exe生成的类,用于反序列化XML文档。出于某种原因,XML文档中相当深的一个节点无法反序列化,我找不到它为什么会这样做…

    以下是我反序列化的方法:

    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;
    }
    

    XSD的相关部分如下所示:

    <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>
    

    其中“ls_header_ts271A1_2110c”到“le_trailer_ts271A_2110c”无法反序列化

    这三个片段是:

    <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>
    

    为最后一个正确循环生成的类是:

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

    [system.serializableAttribute()] [system.diagnostics.debuggerStepThroughAttribute()] [系统.componentModel.designerCategoryAttribute(“代码”)] [system.xml.serialization.xmltypattribute(anonymousType=true,namespace=“http://schemas.microsoft.com/biztalk/edi/x12/2006”)] [system.xml.serialization.xmlrootattribute(namespace=“http://schemas.microsoft.com/biztalk/edi/x12/2006”,isNullable=false)] 公共部分类TS271A1 U 2110C U循环{

    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;
        }
    }
    

    }

    对于熟悉该标准的人来说,这是一个HIPAA271,我无法反序列化2120C循环。对你们其他人来说,我不认为这和具体的问题有关系…

    我已经验证了我需要的节点既存在于XSD中,也存在于我正在解析的实际XML文件中。关于下一步去哪里有什么建议吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Sean Hederman    14 年前

    我也碰到过这个。据我所见,XmlSerializer不支持子节点上的命名空间。必须将其命名空间显式设置为“”(使用xmlns=“”或类似的方法)。