序列化/反序列化 XML,其中 XML 元素可以从两个 xml 元素中选择

本文关键字:XML 元素 xml 选择 两个 反序列化 其中 序列化 | 更新日期: 2023-09-27 18:32:04

我遇到一种情况,我的xml可以将FileWriter或ArgonWriter作为XML元素。

例如:

<Writer>
 <FileWriter>
    <DestinationFolder></DestinationFolder>
</FileWriter
</Writer>

<Writer>
 <HttpWriter>
    <Url></Url>
</Writer>

我们在FileWriter和HttpWriter之间没有任何关系,也没有继承公共接口或类

我可以编写一个映射类来序列化/DeS编写器设置,如下所示

[Serializable]
public class Writer
{
  [XmlElement]
  public FileWriter {get;set;}
[XmlElement]
  public HttpWriter{get;set;}
} 

但在这种情况下,其中一个编写器对象始终为 null

有什么方法可以让我在不需要提及两个对象的地方放置一个通用代码,因为我的根将始终只有一个 xml 元素?

序列化/反序列化 XML,其中 XML 元素可以从两个 xml 元素中选择

使用 LINQ2XML

XDocument doc=XDocument.Parse(xmlString);
var output=doc.Descendants()
              .Elements()
              .Where(x=>x.Name.LocalName=="FileWriter"||x.Name.LocalName =="HttpWriter")
              .Select(e=>
                   new
                   {
                     Type=e.Name.LocalName.ToString(),
                     Path=(x.Element("DestinationFolder")!=null)
                          ? x.Element("DestinationFolder").Value
                          : x.Element("Url").Value
                   });

您现在可以迭代输出

foreach(var writer in output)
{
    writer.Type;
    writer.Path;
}