2013-04-22 3 views
0

У меня есть следующий фрагмент кодаВыберите количество данных на основе конкретного узла

XmlDocument docu = new XmlDocument(); 
     docu.Load(file); 
XmlNodeList lst = docu.GetElementsByTagName("name"); 
         foreach (XmlNode n in lst) 
         { 
          string text = n.InnerText; 
    var types = doc.Element("program").Element("program-function").Element("function").Descendants("type").Where(x => x.Value == text).Select(c => c.Value).ToArray(); 
    } 

мой XML выглядит следующим образом

<program> 
    <program-function> 
    <function> 
    <name>add</name> 
    <return-type>double</return-type> 
    <params> 
    <type>double</type> 
    <type-value>a</type-value> 
    <type>double</type> 
    <type-value>b</type-value> 
    <type>string</type> 
    <type-value>c</type-value> 
    </params> 
    <body> return a + b + c; </body> 
</function> 
    <function> 
    <name>test</name> 
    <return-type>int</return-type> 
    <params> 
    <type>double</type> 
    <type-value>a</type-value> 
    <type>double</type> 
    <type-value>b</type-value> 
    </params> 
    <body> return a + b; </body> 
    </function> 
</program-function> 
</program> 

мне нужно, чтобы иметь возможность получить количество <type> для каждый <name>

результат для дополнения должно быть 3 = types.count() = 3
результат для испытаний должно быть 2 = types.count() = 2

любой совет?

EDIT: Если я хочу получить каждое значение внутри types? то есть. add должно содержать a, b, c и test должно содержать a, b. Очень хотелось бы, чтобы хранить его в массив для облегчения поиска

ответ

1

Как об использовании Linq для Xml

var xDoc = XDocument.Parse(xml); 
var functions = xDoc.Descendants("function") 
       .Select(f => new 
       { 
        Name = f.Element("name").Value, 
        Types = f.Descendants("type").Select(t=>t.Value).ToList(), 
        //Types = f.Descendants("type").Count() 
        TypeValues = f.Descendants("type-value").Select(t=>t.Value).ToList() 
       }) 
       .ToList(); 
+0

Что делать, если я хочу получить каждое значение внутри 'types'? то есть. 'add' должен содержать' a', 'b', c' и' test' должен содержать 'a',' b'. хотел бы сохранить его в массиве для облегчения поиска. – user2248001

+0

@ user2248001 Я обновил ответ. Но в следующий раз задайте полный вопрос и не продлевайте его комментарии ... Если вы хотите, чтобы массив заменил 'ToList' на 'ToArray' – I4V

+0

, я также сделаю редактирование в вопросе – user2248001

0

Попробуйте это:

XDocument doc = XDocument.Load(your file); 
var vals = doc.Element("program").Element("program-function").Elements("function"); 

var result = vals.Select(i => 
        new { name = i.Element("name"), 
          count = i.Elements("type").Count() } 
+0

Что делать, если я хочу, чтобы получить каждое значение внутри 'types'? то есть. 'add' должен содержать' a', 'b', c' и' test' должен содержать 'a',' b'. хотел бы сохранить его в массиве для облегчения поиска. – user2248001

+0

@ пользователь2248001 это другой вопрос. –

Смежные вопросы