Pregunta

Tener problemas deserializar algunos XML en un objeto en C #.

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>

(snipped)

El archivo que estoy tratando de importación 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>

(snipped)

pensar lo que está sucediendo es que cuando intento .NET para derserialize el xml, que llega a la primera línea que contiene el "xmlns: ast" y quejas al respecto. Como yo lo entiendo, .Net se intenta asignar atributos a una propiedad pública en la clase de destino (y no lo puedo 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 se ve de la siguiente manera:

    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 añadir 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 hay una manera que puedo usar esto para decirle lo .Net espacios de nombres para aceptar.

Sería agradecido un poco de ayuda iwth 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;
¿Fue útil?

Solución

Sin xsd / xml completa, o (alternativamente) sus clases de C #, no podemos reproducir. Sin embargo, trabajar desde el XML hacia arriba, esta bien que funciona para mí; es decir: el error no es (por lo que puedo ver) en el código / datos informados. Se puede 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));

Otros consejos

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top