如何在一个类中反序列化两种不同的XML类型

时间:2019-05-28 20:20:42

标签: c# .net-core .net-standard .net-standard-2.0

我有两个不同的XML文档。它们的结构几乎相同,但是有一些不同的元素。

我想将传入的文档反序列化为一个类,这是两个类的超集。不需要序列化类,只需要反序列化文档即可。

XML文档类型具有不同的根元素,可以说第一个的根是<CLASSA>,另一个是<CLASSB>。 我正在寻找类似的内容,其中<CLASSA><CLASSB> xml文档都映射到ClassAandB

[XmlRoot(ElementName="CLASSA,CLASSB")]
public class ClassAandB {
    [XmlElement(ElementName="syntaxid")]
    public Syntaxid Syntaxid{ get; set; }
    [XmlElement(ElementName="email")]
    public Email Email { get; set; }
    [XmlElement(ElementName="envelope")]
    public Envelope Envelope { get; set; }
    [XmlElement(ElementName="header")]
    public Header Header { get; set; }
}

然后,我可以通过阅读Syntaxid属性来找出这两种类型中的哪一种。这对我有帮助,因为两种类型的很多处理都是相同的。 有什么建议怎么做吗?

2 个答案:

答案 0 :(得分:0)

我建议您删除XmlRoot属性并使用:

var doc = new XmlDocument();
doc.Load("file.xml");
XmlElement root = xmlDoc.DocumentElement;
var serializer = new XmlSerializer(typeof(ClassAandB), new XmlRootAttribute(root.ToString()));

答案 1 :(得分:0)

由于xml根元素名称可能取决于xml文档的内容,因此您必须在运行时使用要使用的xml根元素名称配置XmlSerializer
在这种情况下,就不再需要应用XmlRootAttribute

这可以通过constructor overload接受XmlRootAttribute参数来完成,您可以通过该参数传递根元素名称。

public XmlSerializer (Type type, System.Xml.Serialization.XmlRootAttribute root);

您可能知道前面的根元素名称,例如。取决于xml文档的来源,或者您可以在运行时从xml文档本身中发现它。

下面示例中的以下内容显示了如何设置xml根元素名称。

String rootName = "CLASSA"; // "CLASSB"
var serializer = new XmlSerializer(typeof(ClassAandB), new XmlRootAttribute(rootName));

使用XmlReader作为源并从内容中检索根xml元素名称的简化示例。

public class ClassAandB 
{
    [XmlElement(ElementName="syntaxid")]
    public String Syntaxid{ get; set; }

    [XmlElement(ElementName="email")]
    public String Email { get; set; }

    [XmlElement(ElementName="header")]
    public String Header { get; set; }
}

var classA = Deserialize(XmlReader.Create(
    new StringReader("<CLASSA><syntaxid>A</syntaxid></CLASSA>"))
    );
Console.WriteLine(classA.Syntaxid); // A

var classB = Deserialize(
    XmlReader.Create(new StringReader("<CLASSB><syntaxid>B</syntaxid></CLASSB>"))
    );
Console.WriteLine(classB.Syntaxid); // B

public static ClassAandB Deserialize(XmlReader reader)
{
    reader.MoveToContent();
    string rootName = reader.Name;
    var serializer  = new XmlSerializer(typeof(ClassAandB), 
        new XmlRootAttribute(rootName)
        );
    var deserialized = serializer.Deserialize(reader) as ClassAandB;
    return deserialized;
}
相关问题