C#将XML反序列化为对象

将一些xml反序列化为C#中的对象时遇到问题。

我收到的错误是……

xmlns=''> was not expected. 

我收到的用于生成课程的XSD如下……

     Liste des avis de remboursements          Avis de remboursement lié à une DC   

(剪断)

我尝试导入的文件如下:

    2010-06-22 25.0 0.0 25.0 0.0 0.0 0.0 0 C 319984 030    

(剪断)

认为正在发生的事情是,当.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"); 

我知道有一种方法可以用它来告诉.Net接受哪些命名空间。

对于这个问题的一些帮助会很高兴。

—根据请求更新了类片段(抱歉应该包括之前)这是用xsd.exe创建的—

  ///  [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; ///  [System.Xml.Serialization.XmlElementAttribute("AvisRemboursement")] public AvisRemboursementType[] AvisRemboursement { get { return this.avisRemboursementField; } set { this.avisRemboursementField = value; } } } ///  [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; 

没有完整的xsd / xml,或(或者)你的C#类,我们无法重现。 但是从xml向上工作,这对我来说很好; 含义:在您发布的代码/数据中,错误不是(据我所知)。 你能发布一个更完整(可重复)的例子吗?

 public class ListeAvisRemboursements { private readonly List items = new List(); [XmlElement("AvisRemboursement", Namespace = "xml.AAAAAAA.com/commerce/apres-vente_technique/assistance")] public List 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)); 

这是我正在使用的(抱歉,我很晚才参加派对):

  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