代码之家  ›  专栏  ›  技术社区  ›  Remotec

将XML反序列化为对象

  •  8
  • Remotec  · 技术社区  · 14 年前

    在C#中将某些xml反序列化为对象时出现问题。

    我收到的错误是。。。

    xmlns=''> was not expected.
    

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

    (剪断)

    我试图导入的文件如下:

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

    认为 正在发生的是,当.Net尝试反序列化xml时,它会碰到第一行,其中包含“xmlns:ast”和对它的抱怨。据我所知,.Net将尝试将属性映射到目标类中的公共属性(它找不到称为xmlns的属性)。或者我处理名字空间的方式有问题。

    我的反序列化代码如下所示:

        XmlDocument _Doc = new XmlDocument();
        _Doc.Load(@"C:\inputfile.xml");
    
        XmlSerializer _XMLSer = new XmlSerializer(typeof(ListeAvisRemboursements));
        ListeAvisRemboursements _X = (ListeAvisRemboursements)_XMLSer.Deserialize(new StringReader(_Doc.OuterXml));
    

    我还尝试了将名称空间管理器添加到XML文档中的各种组合。。

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

    对解决这个问题会有很大帮助的。

    ---应请求使用类代码段更新(抱歉,之前应该包括)这是用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;
    
    2 回复  |  直到 14 年前
        1
  •  19
  •   Marc Gravell    14 年前

    如果没有完整的xsd/xml,或者(或者)您的C类,我们就无法复制。但从xml向上看,这对我来说很好;这意味着:错误不在(据我所见)您发布的代码/数据中。你能发布一个更完整(可复制)的例子吗?

    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
    }
    

    也适用于:

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

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

    XmlDocument _Doc = new XmlDocument();
    _Doc.Load("inputfile.xml");
    var ser = new XmlSerializer(typeof(ListeAvisRemboursements));
    var wrapper = (ListeAvisRemboursements)ser.Deserialize(new XmlNodeReader(_Doc.DocumentElement));
    
        2
  •  0
  •   Denis    9 年前

    这是我要用的东西(对不起,我来晚了):

      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