我有以下课程:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:eu.emsa.ssn")]
public partial class SSN_ReceiptType {
private Header1Type headerField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public Header1Type Header {
get {
return this.headerField;
}
set {
this.headerField = value;
}
}
}
以下XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SSN_Receipt xmlns="urn:eu.emsa.ssn">
<Header StatusMessage="SomethingSomething" StatusCode="Blabla" SSNRefId="N/A" MSRefId="2674762" Version="2.0" To="NCANOHAU1" SentAt="2010-11-12T14:48:44Z" From="SSN"/>
</SSN_Receipt>
我使用这种类型化的方法来反序列化(通过调用Deserialize&lt; SSN_ReceiptType&gt;(xmlGoesHere)):
/// <summary>
/// Deserialize xml string to object of type T
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T Deserialize<T>(string xml)
{
try
{
// Create serializer
var xs = new XmlSerializer(typeof(T));
// Deserialize
T t = (T)xs.Deserialize(new StringReader(xml));
return t;
}
catch (Exception e)
{
log.Error(string.Format("Unable to deserialize XML: {0}", xml), e);
return default(T);
}
}
现在这里是踢球者。这曾经工作过。但是最近我们收到了用于生成类的新版本的XSD,并且在生成新代码之后(对于这个类没有改变,如上所述),我在尝试反序列化时收到以下异常:
System.SystemException:“XML文档(1,57)中存在错误”
而且:
System.InnerException:&lt; SSN_Receipt xmlns ='urn:eu.emsa.ssn'&gt;没想到。
到底是什么? :S我尝试添加一个指定“SSN_Receipt”的XmlRootAttribute,这对一位没有帮助。有谁知道发生了什么事?
更新:XSD的相关部分:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ssn="urn:eu.emsa.ssn"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="urn:eu.emsa.ssn">
[...]
<xsd:element name="SSN_Receipt" type="ssn:SSN_ReceiptType"/>
[...]
<xsd:complexType name="SSN_ReceiptType">
<xsd:annotation>
<xsd:documentation xml:lang="en"/>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="Header" type="ssn:Header1Type"/>
</xsd:sequence>
</xsd:complexType>
答案 0 :(得分:3)
为了将来参考其他可怜的灵魂,这是我提出的解决方案。
正如我的问题所述,我的课程是从XSD生成的。我测试了我们类的先前版本,它们工作得很好。此外,使用相同类的SOAP服务也可以使用。检查跟踪日志,我看不出任何特别的揭示。
但我找到了具体的解决方案。我在课程中添加了以下属性:
[System.Xml.Serialization.XmlRoot(Namespace = "urn:eu.emsa.ssn",
ElementName = "SSN_Receipt")]
现在,我不想用自定义代码丢弃我生成的类,所以我添加了一个部分类:
[System.Xml.Serialization.XmlRoot(Namespace = "urn:eu.emsa.ssn",
ElementName = "SSN_Receipt")]
public partial class SSN_ReceiptType {}
这完全解决了我的问题。但我仍然不明白为什么这首先打破了。
如果有人能够提出一个很好的可测试答案,为什么它会破裂,我会做出正确答案。
谢谢你们的时间!这在某种程度上是一种教育经验:)
答案 1 :(得分:0)
我很确定你的xml应该读
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ssn:SSN_Receipt xmlns="urn:eu.emsa.ssn">
<ssn:Header StatusMessage="SomethingSomething" StatusCode="Blabla" SSNRefId="N/A" MSRefId="2674762" Version="2.0" To="NCANOHAU1" SentAt="2010-11-12T14:48:44Z" From="SSN"/>
</ssn:SSN_Receipt>
答案 2 :(得分:0)
您应该生成SSN_Receipt
个类。将该类传递给反序列化方法时需要使用该类。
IE:
Deserialize<SSN_Receipt>(xmlGoesHere);
而不是SSN_ReceiptType