【问题标题】:c# Deserializing an element based on it's parent node's namec# 根据父节点名称反序列化元素
【发布时间】:2012-04-14 09:37:55
【问题描述】:

我正在使用的 XML 具有以下结构:

 <fixture_statistics>
  <home_player_1 id="2306143" teamid="2">
   <element_1>Some Data</element_1>
   <element_2>Some Data</element_2>
  </home_player_1>
  <home_player_2 id="2306144" teamid="2">
   <element_1>Some Data</element_1>
   <element_2>Some Data</element_2>
  </home_player_2>
 </fixture_statistics>

现在反序列化它的代码通常如下所示:

[XmlRootAttribute("fixture_statistics", Namespace = "", IsNullable = false)]
    public class FixtureRoot
    {
        [XmlElement("home_player_1")]
        [XmlElement("home_player_2")]
        public List<FixtureStats> fixtures { get; set; }
    }
    public class FixtureStats
    {
        public string element_1;
        [XMLElement("element_2")]
        public string elementTwo;
    }

问题是:我希望 FixtureStats 类有一个“位置”属性,该属性对应于它的父元素名称(因此对应于 home_player_1 的 FixtureStat 对象的位置=1)。 这可以通过内置的序列化属性来完成吗?

如果不可能,最干净的解决方法是什么?请记住,每个文档将包含大约 50 个播放器元素,每个包含大约 50 个“子”数据元素。

【问题讨论】:

  • 这个 Xml 文档的结构设计得很差。您是否可以更改它以删除后缀?如果不是,那么我可以想到 3 种处理方法: - 通过删除/重新创建后缀(添加额外步骤)在序列化之前/之后转换文档,实现 IXmlSerializable 接口(这很痛苦),使用 Linq to Xml 处理序列化(不会很通用,可以很快变大)
  • 同意。 xml 的格式不在我的控制之下,所以如果不能按原样使用,则需要进行转换。

标签: c# xml-serialization xml-parsing linq-to-xml


【解决方案1】:

这会有用吗?

XDocument xDoc = XDocument.Load(.....);
var result = 
   xDoc.Descendants("element_1")
   .Select(n => new { Parent = n.Parent.Attribute("id").Value,Value = n.Value, })
   .ToArray();

【讨论】:

    【解决方案2】:
            var xml = XElement.Load("XMLFile1.xml");
    
            int startIndex = 12;
            List<FixtureStats> fixtures =
                (from playerNode in xml.Elements()
                 select new FixtureStats
                 {
                     position = Int32.Parse(playerNode.Name.LocalName.Substring(startIndex)),
                     element_1 = playerNode.Element("element_1").Value,
                     element_2 = playerNode.Element("element_2").Value
                 }).ToList();
    

    你必须在父元素名称中找到整数部分所在的位置。在“home_player_1”的情况下,它是 12,但你可以在不同的情况下找到标准的字符串方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2021-05-17
      相关资源
      最近更新 更多