在将某些 xml 反序列化为 C# 中的对象时出现问题。
我收到的错误是...
xmlns=''> was not expected.
我收到的用于生成我的类的 XSD 如下...
<?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 将尝试将属性映射到目标类中的公共(public)属性(它不会找到一个名为 xmlns 的属性。或者我处理 namespace 的方式有问题。
我的反序列化代码如下所示:
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 创建的---
/// <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;
最佳答案
没有完整的 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));
关于C#反序列化XML到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4085529/