【发布时间】:2018-01-19 08:23:36
【问题描述】:
我想知道如何从 XML 反序列化为一个包含可能是 ARS 或 BRS 类的对象的类
ARS 和 BRS 是从 XSD 文件生成的 由于 ARS 和 BRS 都包含属性 C,所以当 new Serializer 时它会失败
错误: System.InvalidOperationException: '有一个错误反映类型'TestXml.Response'。'
InvalidOperationException:类型“B.C”和“A.C”都使用命名空间“”中的 XML 类型名称“C”。使用 XML 属性为类型指定唯一的 XML 名称和/或命名空间。
我尝试将命名空间添加到 ARS.C 和 BRS.C 但由于响应不包含命名空间,它返回 null
任何建议都会有所帮助,谢谢。
父类“响应”
namespace TestXml
{
[XmlRoot(Namespace="")]
public class Response
{
[XmlElement(ElementName = "ARS", Type = typeof(ARS))]
[XmlElement(ElementName = "BRS", Type = typeof(BRS))]
public object Object;
}
}
类 ARS
namespace A
{
public class ARS
{
public int a;
public C c;
}
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class C
{
public string d;
}
}
类 BRS
namespace B
{
public class BRS
{
public int b;
public C c;
}
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class C
{
public int e;
}
}
通过 XmlSerializer 反序列化
string ooo = @"<Response xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""><ARS><a>1</a><c><d>ca</d></c></ARS></Response>";
XDocument xDoc = XDocument.Parse(ooo);
XmlSerializer ser = new XmlSerializer(typeof(Response));
using (var reader = xDoc.CreateReader(System.Xml.Linq.ReaderOptions.OmitDuplicateNamespaces))
{
Response deserializedObject = (Response)ser.Deserialize(reader);
}
【问题讨论】:
-
把戏。如果您无法将放入的数据反序列化到类中并进行序列化。然后将序列化 xml 与您尝试反序列化的 xml 进行比较并查看差异。
-
感谢您的回复请求添加了命名空间以区分两个类,例如[System.Xml.Serialization.XmlRootAttribute(Namespace = "A", IsNullable = false)] public class C { public string d;由于 web 服务提供者忽略了请求中的命名空间,所以没关系。但是响应中不包含命名空间“A”,因此无法反序列化
-
为什么要关心命名空间。序列化/反序列化仅使用标签名称。如果类名和 xml 标记不匹配,请使用 ElementName 属性。 : [XmlRoot(ElementName = "A")] public class ARS { } XmlRoot 可以放在任何类之前以更改名称。不仅仅是 XML 的根。
-
谢谢jdweng。第一,对于元素名称,Web 服务是由我无法控制的供应商创建的。反应不在我的控制之下。如果 ElementName 更改,则无法序列化对象 ARS。
-
第二,对于命名空间,当 ARS 和 BRS 中的 C 类中的命名空间都设置为“”即 [XmlRootAttribute(Namespace = "", IsNullable = false)] 时,在创建 XmlSerialize 期间发生错误public class C 但是,如果设置为不同的命名空间 [System.Xml.Serialization.XmlRootAttribute(Namespace = "A", IsNullable = false)] 对于 ARS 的 C [XmlRootAttribute(Namespace = "B", IsNullable = false)] BRS 的 C C 的内容为空,我猜是因为命名空间不匹配,在这两种情况下我都无法获得正确的响应对象 ARS,其中包含属性 C。
标签: c# xml object serialization