【问题标题】:XML Serialization of member variable as xmlnode成员变量的 XML 序列化为 xmlnode
【发布时间】:2012-05-09 14:07:46
【问题描述】:

我有一些 XML 想序列化成一个类。

<Group>
 <Employees>
     <Employee>
         <Name>Hari</Name>
         <Age>30</Age>
     </Employee>
     <Employee>
         <Name>Yougov</Name>
         <Age>31</Age>
     </Employee>
     <Employee>
         <Name>Adrian</Name>
         <Age>28</Age>
     </Employee>
</Employees >

上面的 XML 可以很容易地在 C# 中实现。 但我偶然发现了我的要求,即 XML 的样子,

<Group>
 <Employees>
    <Hari Age=30 />
    <Yougov Age=31 />
    <Adrian Age=28 />
 </Employees >
</Group>

员工是List&lt;Employee&gt;KeyValuePair&lt;string, int&gt;("Hari", 30)

如何设计类和成员变量来获取上述序列化的 XML? (前提是员工名单中不会有重复的名字)

非常感谢任何帮助。

*Serializing KeyValuePair

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    在你的情况下,我会选择 Linq2Xml。

    XDocument xDoc = XDocument.Load(......);
    var emps = xDoc.Descendants("Employees").Elements()
        .Select(x => new Employee() { 
                            Name = x.Name.ToString(), 
                            Age = int.Parse(x.Attribute("Age").Value) 
                        })
        .ToList();
    

    PS:Age=30 无效。应该是Age="30"

    【讨论】:

      【解决方案2】:

      将数据用作架构不是一个好主意;特别是,很多名称无效作为 xml 元素名称,而且:这不是一个好的做法(例如,它在模式验证方面几乎没有用处)。如果你想简洁,也许是这样的:

      <Employees>
          <Add Name="Hari" Age="30" />
      </Employees>
      

      <Employees>
          <Employee Name="Hari" Age="30" />
      </Employees>
      

      这可以简单地完成:

      [XmlArray("Employees"), XmlArrayItem("Employee")]
      public List<Employee> Employees {get;set;}
      

      和:

      public class Employee {
          [XmlAttribute]
          public string Name {get;set;}
          [XmlAttribute]
          public int Age {get;set;}
      }
      

      XmlSerializer 不支持“内容作为元素名称”序列化程序,除非您自己使用 IXmlSerializable 来自父元素(它会来自父母,因为XmlSerializer 无法识别要在那里处理的孩子)。

      【讨论】:

      • 谢谢 Marc,第二个选项是我现在实际使用的,因为它较少侵入我所需的架构。但是应该有一些方法可以实现结果吗?
      • 好吧,关于验证,“名称”只是问题的占位符,实际值只是字母数字 id[0-1 A-Z a-z]。所以这不会是一个问题,id也是唯一的,所以它不会在同一个节点中重复。 (如果不是,我在验证中做错了什么,或者有人搞砸了我的 XML,这是完全不同的情况!)
      • @Aczire 重复一遍:XmlSerializer 对你想做的事情没有多大帮助
      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多