根据特定节点选择数据数量

时间:2013-04-22 13:52:49

标签: c# xml linq-to-xml

我有以下代码

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

任何建议?

编辑:如果我想检索types内的每个值?即。 add应包含abctest应包含ab。希望将它存储在数组中以便于检索

2 个答案:

答案 0 :(得分:1)

如何使用Linq to 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();

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