2010-11-03 26 views
8

Problemas para deserializar algunos xml en un objeto en C#.C# Deserializar XML al objeto

El error que recibo es ...

xmlns=''> was not expected. 

El XSD que he recibido para generar mi clase es la siguiente ...

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

(cortado con tijeras)

El El archivo que intento importar es el siguiente:

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

(cortado con tijeras)

Yo creo lo que está sucediendo es que cuando intenta .Net derserialize el xml, que llega a la primera línea que contiene los "xmlns: ast" y quejas al respecto. Según lo entiendo, .Net tratará de asignar atributos a una propiedad pública en la clase objetivo (y no encontrará uno llamado xmlns. O hay algo mal con la forma en que estoy manejando los espacios de nombres.

Mi código de deserialización es el siguiente:

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

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

también he intentado varias combinaciones de la adición de un gestor de espacio de nombres para el documento XML ..

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

entiendo que es una manera de que pueda usar esto para decirle lo .Net espacios de nombres para aceptar.

Estaría encantado de obtener ayuda con este problema.

--- Actualizado a solicitud con fragmento de clase (lo siento debería haber incluido antes) fue creado con este 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

podría por favor publicar el fragmento de su clase ListeAvisRemboursements ... – RameshVel

Respuesta

19

Sin xsd/xml completa, o (alternativamente) el C# clases, no podemos reproducir Pero trabajando desde el xml hacia arriba, esto funciona bien para mí; significado: el error no es (por lo que puedo ver) en el código/datos que publicaste. ¿Puedes publicar un ejemplo más completo (reproducible)?

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 
} 

también funciona bien con:

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

y:

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

y

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

El problema se rastreó hasta definiciones de espacio de nombres incorrectas en el archivo de entrada. – Remotec

0

Esto es lo que estoy usando (lo siento soy un poco tarde a la fiesta):

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