разбирать Linq To Xml с атрибутивными узлами - PullRequest
1 голос
/ 29 марта 2010

У меня есть 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 имеет то же имя узла "node", что и element2. Я хочу проанализировать этот XML на основе псевдонима атрибута.

Каким должен быть код Linq-To-Xml (с использованием C #), чтобы добиться этого?

Ответы [ 2 ]

2 голосов
/ 29 марта 2010

Это метод разбора структуры данных на элементы, которые содержат строковое свойство 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 голос
/ 29 марта 2010

Вы можете сделать что-то вроде этого:

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

Который найдет все узлы, чей атрибут псевдонима - element1.

...