我有两个不同的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属性来找出这两种类型中的哪一种。这对我有帮助,因为两种类型的很多处理都是相同的。 有什么建议怎么做吗?
答案 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;
}