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