Question

Des problèmes désérialisation certains xml dans un objet en C #.

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

xmlns=''> was not expected.

Le XSD que j'ai reçu 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>

(coupé)

Le fichier que je tente d'importer est comme suit:

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

(coupé)

penser ce qui se passe est que lorsque l'on tente de .Net derserialize le xml, il frappe la première ligne qui contient le « xmlns: ast » et les plaintes à ce sujet. Si je comprends bien, .Net va essayer de mapper les attributs d'une propriété publique dans la classe cible (et il ne trouverez pas un xmlns appelé. Ou il y a quelque chose de mal avec la façon dont je traitais les espaces de noms.

Mon code 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 également 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 utiliser pour dire .Net à accepter ce que des espaces de noms.

serait-greatful pour une aide iwth 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;
Était-ce utile?

La solution

Sans xsd / xml complète, ou (alternativement) vos C classes #, nous ne pouvons pas reproduire. Mais le travail du xml vers le haut, cela fonctionne bien pour moi; ce qui signifie: l'erreur est pas (pour autant que je peux voir) dans le code / données affichées. Pouvez-vous envoyer 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));

Autres conseils

Voici ce que je me sers (désolé suis un peu en retard à la partie):

  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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top