【问题标题】:Serialize List<Tuple<String, String>> to Attributes将 List<Tuple<String, String>> 序列化为属性
【发布时间】:2013-07-05 13:38:36
【问题描述】:

我想将元组列表序列化为 XML 属性。例如:

List<Tuple<String, String>> attributes = new List<Tuple<String, String>>();
attributes.Add(New Tuple("att1", value1"));
attributes.Add(New Tuple("att2", value2"));

它应该显示为:

<Root att1="value1" att2="value2">
</Root>

编辑: 我有一个这样的类,我正在使用 XmlSerializer 对其进行序列化:

public class Root
{
     List<Tuple<String, String>> attributes = new List<Tuple<String, String>>();

     //other attributes and elements exist in this class
}

有没有简单的方法?

谢谢

【问题讨论】:

  • 您遇到了什么问题,您尝试过什么?
  • 你应该用XmlAttributeAttribute定义类中的元素。
  • 问题是我事先不知道属性的名称和数量。所以它必须是数组/列表等中的某种未定义元素。

标签: c# serialization


【解决方案1】:

您的语法不正确,因为 New 在 VB 而不是 C# 中大写。

请阅读XDocument 的文档并尝试完成示例。

这是一个例子:

var attributes = new List<Tuple<string, string>>();
attributes.Add(Tuple.Create("att1", "value1"));
attributes.Add(Tuple.Create("att2", "value2"));

var document = new XDocument();
var root = new XElement("Root");
document.Add(root);

foreach(var node in attributes.Select(x => new XAttribute(x.Item1, x.Item2)))
{
    root.Add(node);
}

Console.WriteLine(document); // <Root att1="value1" att2="value2" />

编辑:

要使用XmlSerializer 使用属性:

[XmlType("Root")]
public class Root
{
    [XmlAttribute("attr1")]
    public string Attribute1 { get; set; }
    [XmlAttribute("attr2")]
    public string Attribute2 { get; set; }
}

或者您需要为动态属性实现IXmlSerializable

【讨论】:

  • 问题是我事先不知道属性的名称和数量。所以它必须是数组/列表等中的某种未定义元素。
  • 那么 XDocument 可能会提供最简单的用法。这是否需要既可序列化又可反序列化?
  • 是的,需要序列化和反序列化。
  • 看看XML Serialize dynamic object是否适合你。
猜你喜欢
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
相关资源
最近更新 更多