c#中的条件XMLElement

时间:2014-12-10 14:19:36

标签: c# xml serialization

我正在尝试使用以下类文件序列化为XML

public class BatchFile
{
    [XmlElement("File1")]
    public List<string> FileObject { get; set; }
}

以下是我的C#代码来序列化这个类

 var batchFile = new BatchFile();
 XmlSerializer serializer = new XmlSerializer(typeof(BatchFile));
 using (TextWriter writer = new StreamWriter(@"E:\BatchFile1.xml"))
  {               
  serializer.Serialize(writer, batchFile);
  }

我需要动态地在FileObject属性上使用XMLElement。

它将是File1或File2或File3。

我不知道如何继续这样做。

已提及     How do I model a dynamic XML element in a C# serialization class? 和  Change xml element value dynamically

但他们似乎不适合我。

2 个答案:

答案 0 :(得分:0)

首先 - 我不相信你正在使用合适的工具来完成工作。 XML序列化是一种工具,允许您将对象转换为易于传输(和人类可读)的形式 - 然后返回。这确实意味着一个固定的架构。

如果您坚持使用XML序列化,为什么不采用最简单的方法?

[XmlElement("File1")]
public List<string> File1 { get; set; }

[XmlElement("File2")]
public List<string> File2 { get; set; }

[XmlElement("File3")]
public List<string> File3 { get; set; }

[XmlIgnore]
public List<string> FileObject
{
   get { return this.File1 ?? this.File2 ?? this.File3; }
}

答案 1 :(得分:0)

如果您想要名为File1FileN的节点,您将不得不实施IXmlSerializable并手动构建/解析XML。没有属性可以枚举集合项并提供顺序名称。

如果您只支持有限数量的元素(比如3),则可以为这3个元素添加属性:

public class BatchFile
{
    [XmlIgnore]
    public List<string> FileObject { get; set; }

    public string File1 
    { 
        get {return FileObject[0];} 
        set {FileObject[0] = value; }
    }

    public string File2 { get; set; }
    { 
        get {return FileObject[1];} 
        set {FileObject[1] = value; }
    }

    public string File3 { get; set; }
    { 
        get {return FileObject[2];} 
        set {FileObject[2] = value; }
    }

}

当然,您需要添加适当的边界检查。