Xml反序列化具有属性对象

时间:2018-01-19 08:23:36

标签: c# xml object serialization

我想知道如何从XML反序列化为包含对象的类,该对象可以是ARS或BRS类中的任何一个

ARS和BRS是从XSD文件生成的 由于ARS和BRS都包含属性C,因此在新的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);
 }

1 个答案:

答案 0 :(得分:0)

我最后使用xml linq首先提取响应字符串的子部分,然后逐个反序列化,以便冲突不再存在