2010-03-29 175 views
1

我有以下結構解析Linq到與屬性XML節點

<ruleDefinition appId="3" customerId = "acf"> 
    <node alias="element1" id="1" name="department"> 
     <node alias="element2" id="101" name="mike" /> 
     <node alias="element2" id="102" name="ricky" /> 
     <node alias="element2" id="103" name="jim" /> 
    </node> 
</ruleDefinition> 

這裏節點使用別名和未分化的與節點標籤的XML。正如您所看到的,頂層節點element1具有與element2相同的節點名稱「node」。我想根據屬性別名解析這個XML。

什麼應該是Linq-To-Xml代碼(使用C#)來實現它?

+0

添加了常規的c#標籤以獲得更好的可見性和更多的響應。 – 2010-03-29 15:49:02

+0

感謝您編輯標籤 – 2010-03-30 07:48:51

回答

2

這是一種將數據結構解析爲包含Element1字符串屬性和IEnumerable Element2屬性(包含您的多個element2數據)的項目的方法。

string xml = @"<ruleDefinition appId=""3"" customerId = ""acf""> 
    <node alias=""element1"" id=""1"" name=""department""> 
     <node alias=""element2"" id=""101"" name=""mike"" /> 
     <node alias=""element2"" id=""102"" name=""ricky"" /> 
     <node alias=""element2"" id=""103"" name=""jim"" /> 
    </node> 
    </ruleDefinition>"; 

XDocument document = XDocument.Parse(xml); 

var query = from node in document.Descendants("node") 
      where node.Attribute("alias").Value == "element1" 
      select new 
      { 
       Element1 = new 
          { 
           Id = node.Attribute("id").Value, 
           Name = node.Attribute("name").Value 
          }, 

       Element2 = from n in node.Descendants("node") 
          where n.Attribute("alias").Value == "element2" 
          select new 
          { 
           Id = n.Attribute("id").Value, 
           Name = n.Attribute("name").Value 
          } 
      }; 

foreach (var item in query) 
{    
    Console.WriteLine("{0}\t{1}", item.Element1.Id, item.Element1.Name); 

    foreach (var element2 in item.Element2) 
     Console.WriteLine("\t{0}\t{1}", element2.Id, element2.Name); 
} 
+0

謝謝。它的工作很完美... – 2010-03-30 07:50:05

1

你可以做這樣的事情:

XDocument doc = XDocument.Parse(YourXML);  
var nodes = doc.Descendants("node").Where(x => x.Attribute("alias").Value == "element1"); 

哪個會發現其別名屬性部件1的所有節點。