【问题标题】:Serialize/DeSerialize XML where XML element can be chosen either from two xml element序列化/反序列化 XML,其中 XML 元素可以从两个 xml 元素中选择
【发布时间】:2013-09-20 11:35:22
【问题描述】:

我的 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;}

} 

但在这种情况下,Writer 对象之一始终为 null

有什么方法可以为我不需要提到两个对象的地方放置一个通用代码,因为我的根总是只有一个 xml 元素??

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    使用 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;
    }
    

    【讨论】:

    • 您好,感谢您的回复.. 我不确定我将在哪里编写这个逻辑来反序列化我的 Xml..我在这里使用 XmlSerializer,它使用直接将对象映射到 Xml 或 Xml 到对象Xml 属性说 [XmlElement].. 在这种情况下,我正在寻找 XmlSerializer 进行自身映射的解决方案(您可以说它对我来说是一个限制,而且我们必须遵循我们当前的内部 FWK :( ).. 也是上面的我的示例只是 xml 的一部分。我有一个很大的 Xml 和我能够正确序列化它的所有其他元素...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多