2012-03-30 20 views
0

我與具有以下結構工作的XML:C#反序列化基礎上的一個元素的父節點的名稱

<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類有一個'position'屬性,它對應於父元素的名稱(所以FixtureStat對象對應於home_player_1的位置= 1)。 這可以通過內置序列化atrributes完成嗎?

如果不可能,最乾淨的解決方法是什麼?請記住,每個文檔將包含大約50個播放器元素,每個元素包含大約50個「子」數據元素。

+0

這個Xml文檔的結構設計不佳。你能夠改變它,以便後綴被刪除嗎?如果不是,那麼我可以想到3種處理方式: - 通過刪除/重新創建後綴(添加額外步驟),實現IXmlSerializable接口(這很痛苦),使用Linq to Xml處理序列化(不會很通用,可以很快得到) – Pawel 2012-03-31 05:28:29

+0

同意。 xml的格式不在我的控制之下,所以如果它不能像原樣那樣工作,那麼就需要一個轉換步驟。 – daveharnett 2012-03-31 10:04:46

回答

0

推薦給朋友推薦這個有用嗎?

XDocument xDoc = XDocument.Load(.....); 
var result = 
    xDoc.Descendants("element_1") 
    .Select(n => new { Parent = n.Parent.Attribute("id").Value,Value = n.Value, }) 
    .ToArray(); 
0
 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,但你可以在不同情況下使用標準字符串方法。

相關問題