使用属性节点解析Linq To Xml

时间:2010-03-29 14:01:55

标签: c# xml linq c#-3.0 linq-to-xml

我的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>

此处节点使用别名而不是节点标记进行区分。如您所见,顶级节点element1具有与element2相同的节点名称“node”。我想根据属性别名解析这个XML。

Linq-To-Xml代码应该是什么(使用C#)来实现这个目标?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

你可以这样做:

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

将找到别名属性为element1的所有节点。