2010-03-29 109 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的所有节点。