【问题标题】:Condtional XMLElement in c#c#中的条件XMLElement
【发布时间】:2014-12-10 14:19:35
【问题描述】:

我正在尝试使用以下类文件序列化为 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

但它们似乎不适合我。

【问题讨论】:

  • 我对您希望 XML 的外观有点困惑。你是说你有一个字符串列表,想要将列表表示为一组具有动态绑定名称的同名元素吗?或者您想单独命名每个列表条目?如果您向我们展示了一些示例 XML,它可能有助于澄清。

标签: c# xml serialization


【解决方案1】:

首先 - 我认为您使用的工具并不适合这项工作。 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; }
}

【讨论】:

    【解决方案2】:

    如果您想要名为 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; }
        }
    
    }
    

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

    【讨论】:

    • File1-3 属性的类型不应该是string 而不是List&lt;string&gt;
    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多