2010-01-06 7 views
1

Je suis un débutant XML, en utilisant C# .NET 2.0/Visual Studio 2005.XML Désérialisation La production des résultats incorrects

Ce que j'est un échantillon de données en XML que je voudrais convertir en fortement typé structures de données. J'ai également un XSD pour ce fichier que j'ai couru à travers le Visual Studio xsd.exe pour générer le code pour cela. Je l'ai couru contre System.Xml.Serialization.XmlSerializer Il a fait un travail décent, mais il a besoin de quelques ajustements.

Exécution d'un test contre en utilisant ce code:

static int Main() { 
    System.IO.StreamReader str = new System.IO.StreamReader(
     @"C:\xmlstm-2009122816413365.xml"); 
    System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(AidStatements)); 
    AidStatements statementDataSet = (AidStatements)xSerializer.Deserialize(str); 

    foreach (AssocRecord associations in statementDataSet.AssocRecords) { 
     foreach (statementrecord statement in associations.statementrecord) { 
      Console.WriteLine(statement.acctno); 
     } 
    } 

    str.Close(); 

    Console.ReadLine(); 

    return 0; 
} 

Lorsque le code de test affiche simplement le numéro de compte de chaque enregistrement.

Le problème est que le code généré ignore la moitié des enregistrements du fichier. Cela a à voir avec l'élément <Assoc-Record>, je pense.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Aid-Statements"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element maxOccurs="unbounded" ref="Assoc-Record"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="Assoc-Record"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" ref="statement-record"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="statement-record"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="assoc-no"/> 
       <xs:element ref="acct-no"/> 
       <xs:element ref="acct-no-mask"/> 
       <xs:element ref="member-no"/> 
       <xs:element ref="cr-code"/> 
       <xs:element ref="stm-bal-fwd-date"/> 
       <xs:element ref="stm-close-date"/> 
       <xs:element ref="stm-due-date"/> 
       <xs:element ref="prop-address-info"/> 
       <xs:element ref="own-mail-info"/> 
       <xs:element ref="messages"/> 
       <xs:element ref="balances"/> 
       <xs:element ref="trx-detail"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    ... 

Le code généré à partir xsd.exe est ce (un extrait):

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute("Aid-Statements", Namespace="", IsNullable=false)] 
public partial class AidStatements { 

    private statementrecord[] assocRecordField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlArrayAttribute("Assoc-Record")] 
    [System.Xml.Serialization.XmlArrayItemAttribute("statement-record", typeof(statementrecord), IsNullable=false)] 
    public statementrecord[] AssocRecord { 
     get { 
      return this.assocRecordField; 
     } 
     set { 
      this.assocRecordField = value; 
     } 
    } 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute("statement-record", Namespace="", IsNullable=false)] 
public partial class statementrecord { 
    private string assocnoField; 
    private string acctnoField; 
    private string acctnomaskField; 
    private string membernoField; 
    private string crcodeField; 
    private string stmbalfwddateField; 
    private string stmclosedateField; 
    private string stmduedateField; 
    private propaddressinfo propaddressinfoField; 
    private ownmailinfo ownmailinfoField; 
    private messages messagesField; 
    private balances balancesField; 
    private trxrecord[] trxdetailField; 
    // Matching properties below this 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute("Assoc-Record", Namespace="", IsNullable=false)] 
public partial class AssocRecord { 

    private statementrecord[] statementrecordField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("statement-record")] 
    public statementrecord[] statementrecord { 
     get { 
      return this.statementrecordField; 
     } 
     set { 
      this.statementrecordField = value; 
     } 
    } 
} 

On dirait que xsd.exe est supposant à tort quelque chose <Assoc-Record>, mais rien que j'ai essayé a beaucoup aidé. Essayer de définir <Assoc-Record> comme un attribut de tableau (du mieux que je pouvais comprendre) n'a donné aucun résultat; le code s'exécute mais <Assoc-Record> ne contient aucun élément <statement-record> (hows un tableau de longueur nulle).

En outre, xsd.exe a d'abord transformé AidStatements.assocRecordField en un tableau 2D, que j'ai changé en un tableau 1D pour l'exécuter dans l'état actuel.

Des idées?

Répondre

1

La classe AidStatements devrait ressembler à ceci:

public partial class AidStatements 
{ 
    [XmlElement("Assoc-Record")] 
    public AssocRecord[] AssocRecords; 
} 

Le schéma XSD semble assez déroutant - au lieu de séquences contenant des éléments de certains types les séquences contiennent des références à un élément et ce confond probablement xsd.exe (tous ceux XmlTypeAttribute(AnonymousType=true) regarde bizarre).

+0

Haha, pas de blague. Dès que j'ai vu le schéma, même si je ne suis pas un expert en XML/XSD, j'ai su être déçu. – Chris

+0

Je me suis mis à essayer ce correctif le jour suivant et même si ça ne fonctionnait pas parfaitement après ça, ça me rapprochait assez pour faire les changements dont j'avais besoin pour le faire fonctionner. Merci! – Chris

Questions connexes