2010-11-03 5 views
8

Problèmes de désérialisation de certains éléments XML dans un objet en C#.C# Désérialisation du XML vers l'objet

L'erreur que je reçois est ...

xmlns=''> was not expected. 

Le XSD que je reçus pour générer ma classe est la suivante ...

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

Le le fichier que j'essaie d'importer est le suivant:

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

Je pense ce qui se passe est que lorsque .Net tente de derserialize le xml, il frappe la première ligne qui contient les « xmlns: ast » et les plaintes à ce sujet. Si je comprends bien, .Net essaiera de mapper des attributs à une propriété publique dans la classe cible (et il ne trouvera pas d'attribut appelé xmlns), ou quelque chose ne va pas dans la façon dont je gère les espaces de noms

Mon code de désérialisation se présente comme suit:

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

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

J'ai aussi essayé différentes combinaisons d'ajouter un gestionnaire d'espace de noms au document XML ..

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

Je crois savoir qu'il est possible que je peux l'utiliser pour .Net dire ce espaces de noms à accepter

Serait reconnaissant pour de l'aide avec ce problème.

--- Mise à jour à la demande avec extrait de classe (désolé aurait inclus avant) cela a été créé avec 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

Pourriez-vous s'il vous plait publier l'extrait de votre catégorie ListeAvisRemboursements ... – RameshVel

Répondre

19

Sans plein xsd/xml, ou (encore) votre C# classes, nous ne pouvons pas reproduire. Mais travailler à partir du xml vers le haut, cela fonctionne bien pour moi; sens: l'erreur n'est pas (pour autant que je peux voir) dans le code/données que vous avez posté. Pouvez-vous poster un exemple plus complet (reproductible)?

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 
} 

fonctionne aussi bien avec:

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

et:

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

et

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

Le problème a été suivi vers des définitions d'espace de nom incorrectes dans le fichier d'entrée. – Remotec

0

Voici ce que je me sers (désolé je suis un peu tard à la fête):

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