2010-11-03 12 views
8

Probleme beim Deserialisieren einiger XML in ein Objekt in C#.C# Deserialize XML zu Objekt

Der Fehler, die ich erhalte ist ...

xmlns=''> was not expected. 

Die XSD, die ich erhielt meine Klasse zu erzeugen, wie folgt ...

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="xml.AAAAAAA.com/commerce/apres-vente_technique/assistance" xmlns:pgp="xml.AAAAAAA.com/commerce/apres-vente_technique/assistance" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="ListeAvisRemboursements"> 
     <xs:annotation> 
      <xs:documentation>Liste des avis de remboursements</xs:documentation> 
     </xs:annotation> 
     <xs:complexType> 
      <xs:sequence maxOccurs="unbounded"> 
       <xs:element name="AvisRemboursement" type="pgp:AvisRemboursementType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:complexType name="AvisRemboursementType"> 
     <xs:annotation> 
      <xs:documentation>Avis de remboursement lié à une DC</xs:documentation> 
     </xs:annotation> 
     <xs:sequence> 

(snipped)

Die Datei, die ich zu importieren versuche, ist wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<ListeAvisRemboursements xmlns:ast="xml.AAAAAAA.com/commerce/apres-vente_technique/assistance"> 
    <ast:AvisRemboursement NumeroDT="3826961" CodeRA="020545G01" NumeroDC="1"> 
     <ast:DateTraitement>2010-06-22</ast:DateTraitement> 
     <ast:MontantDC>25.0</ast:MontantDC> 
     <ast:MontantMO>0.0</ast:MontantMO> 
     <ast:SommeAD>25.0</ast:SommeAD> 
     <ast:MontantPR>0.0</ast:MontantPR> 
     <ast:SommePR>0.0</ast:SommePR> 
     <ast:FraisGestion>0.0</ast:FraisGestion> 
     <ast:NombreHeuresTotalRemboursees>0</ast:NombreHeuresTotalRemboursees> 
     <ast:Etat>C</ast:Etat> 
     <ast:NoteCredit>319984</ast:NoteCredit> 
     <ast:Imputation>030</ast:Imputation> 
     <ast:ListInterventionsPR/> 
     <ast:ListInterventionsMO/> 
    </ast:AvisRemboursement> 

(snipped)

ich denken, was passiert ist, dass, wenn .Net das xml derserialize versucht, es die erste Zeile trifft, die die enthält „xmlns: ast“ und Beschwerden darüber. Wie ich es verstehe, wird .Net versuchen, Attribute einer öffentlichen Eigenschaft in der Zielklasse zuzuordnen (und es wird keine namens xmlns finden. Oder es ist etwas falsch damit, wie ich die Namensräume handhabe.

Mein Deserialisierungscode sieht wie folgt aus:

XmlDocument _Doc = new XmlDocument(); 
    _Doc.Load(@"C:\inputfile.xml"); 

    XmlSerializer _XMLSer = new XmlSerializer(typeof(ListeAvisRemboursements)); 
    ListeAvisRemboursements _X = (ListeAvisRemboursements)_XMLSer.Deserialize(new StringReader(_Doc.OuterXml)); 

ich auch .Net verschiedene Kombinationen von Hinzufügen eines Namespace-Manager zum XML-Dokument ..

XmlNamespaceManager _Ns = new XmlNamespaceManager(_Doc.NameTable); 
_Ns.AddNamespace("ast", "xml.AAAAAAA.com/commerce/apres-vente_technique/assistance"); 

ich verstehe, gibt es eine Weise, die ich diese verwenden können, zu sagen versucht haben, was Namespaces zu akzeptieren

Wäre für einige Hilfe mit diesem Problem dankbar.

--- Aktualisiert Anfrage mit Klasse-Schnipsel (sorry, bevor aufgenommen haben sollte) diese mit xsd.exe ---

/// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "xml.AAAAAAA.com/commerce/apres-vente_technique/assistance")] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "xml.AAAAAAA.com/commerce/apres-vente_technique/assistance", IsNullable = false)] 
    public partial class ListeAvisRemboursements 
    { 

     private AvisRemboursementType[] avisRemboursementField; 

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

    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "xml.AAAAAAA.com/commerce/apres-vente_technique/assistance")] 
    public partial class AvisRemboursementType 
    { 

     private System.DateTime dateTraitementField; 

     private double montantDCField; 

     private double montantMOField; 

     private double sommeADField; 

     private double montantPRField; 
+1

könnten Sie bitte das Snippet Ihrer ListeAvisRemourseements-Klasse posten ... – RameshVel

Antwort

19

Ohne eine vollständige xsd/xml oder (alternativ) C# erstellt wurde Klassen können wir nicht reproduzieren. Aber ab dem Xml funktioniert das gut für mich; Bedeutung: Der Fehler ist nicht (soweit ich sehen kann) in den Code/Daten, die Sie gepostet haben. Können Sie ein vollständigeres (reproduzierbares) Beispiel veröffentlichen?

public class ListeAvisRemboursements 
{ 
    private readonly List<AvisRemboursement> items = new List<AvisRemboursement>(); 
    [XmlElement("AvisRemboursement", Namespace = "xml.AAAAAAA.com/commerce/apres-vente_technique/assistance")] 
    public List<AvisRemboursement> Items { get { return items; } } 
} 
public class AvisRemboursement 
{ 
    [XmlAttribute] public string NumeroDT {get;set;} 
    [XmlAttribute] public string CodeRA {get;set;} 
    [XmlAttribute] public string NumeroDC {get;set;} 
    public DateTime DateTraitement { get; set; } 
    public decimal MontantDC { get; set; } 
    public decimal MontantMO { get; set; } 
    public decimal SommeAD { get; set; } 
    public decimal MontantPR { get; set; } 
    public decimal SommePR { get; set; } 
    public decimal FraisGestion { get; set; } 
    public int NombreHeuresTotalRemboursees { get; set; } 
    public string Etat { get; set; } 
    public string NoteCredit { get; set; } 
    public string Imputation { get; set; } 
} 
static void Main() 
{ 
    var ser = new XmlSerializer(typeof(ListeAvisRemboursements)); 
    var wrapper = (ListeAvisRemboursements)ser.Deserialize(new StringReader(xml)); 
    // inspect wrapper.Items etc 
} 

funktioniert auch gut mit:

var ser = new XmlSerializer(typeof(ListeAvisRemboursements)); 
using (var reader = XmlReader.Create("inputfile.xml")) 
{ 
    var wrapper = (ListeAvisRemboursements)ser.Deserialize(reader); 
} 

und:

XmlDocument _Doc = new XmlDocument(); 
_Doc.Load("inputfile.xml"); 
var ser = new XmlSerializer(typeof(ListeAvisRemboursements)); 
var wrapper = (ListeAvisRemboursements)ser.Deserialize(new StringReader(_Doc.OuterXml)); 

und

XmlDocument _Doc = new XmlDocument(); 
_Doc.Load("inputfile.xml"); 
var ser = new XmlSerializer(typeof(ListeAvisRemboursements)); 
var wrapper = (ListeAvisRemboursements)ser.Deserialize(new XmlNodeReader(_Doc.DocumentElement)); 
+0

Das Problem wurde auf falsche Namenraumdefinitionen in der Eingabedatei zurückgeführt. – Remotec

0

Hier ist, was ich verwende (sorry bin ein bisschen spät zur Party):

Public Function Serialize(Of YourXMLClass)(ByVal obj As YourXMLClass, 
                 Optional ByVal omitXMLDeclaration As Boolean = True, 
                 Optional ByVal omitXMLNamespace As Boolean = True) As String 

     Dim serializer As New XmlSerializer(obj.GetType) 
     Using memStream As New MemoryStream() 
      Dim settings As New XmlWriterSettings() With { 
        .Encoding = Encoding.UTF8, 
        .Indent = True, 
        .OmitXmlDeclaration = omitXMLDeclaration} 

      Using writer As XmlWriter = XmlWriter.Create(memStream, settings) 
       Dim xns As New XmlSerializerNamespaces 
       If (omitXMLNamespace) Then xns.Add("", "") 
       serializer.Serialize(writer, obj, xns) 
      End Using 

      Return Encoding.UTF8.GetString(memStream.ToArray()) 
     End Using 
    End Function 

Public Function Deserialize(Of YourXMLClass)(ByVal obj As YourXMLClass, ByVal xml As String) As YourXMLClass 
     Dim result As YourXMLClass 
     Dim serializer As New XmlSerializer(GetType(YourXMLClass)) 

     Using memStream As New MemoryStream() 
      Dim bytes As Byte() = Encoding.UTF8.GetBytes(xml.ToArray) 
      memStream.Write(bytes, 0, bytes.Count) 
      memStream.Seek(0, SeekOrigin.Begin) 

      Using reader As XmlReader = XmlReader.Create(memStream) 
       result = DirectCast(serializer.Deserialize(reader), YourXMLClass) 
      End Using 

     End Using 
     Return result 
    End Function