如何在Linq中通过属性获取元素的值

本文关键字:获取 属性 元素 Linq | 更新日期: 2023-09-27 18:30:11

我是Linq的新手,所以很抱歉提出这个非常基本的问题。

我有以下类型的XML

<QuestionSet type="MCQ">
  <Question>
    What will the output of following
       // main()
       // {
        // int x = 10, y = 15;
        // x = x++;
        // y = ++y;
        // printf("%d, %d", x, y);
       // }
    </Question>"
<Options>
    <Option number="1">10, 15</Option>
    <Option number="2">10, 16</Option>
    <Option number="3">11, 15</Option>
    <Option number="4">11, 16</Option>
  </Options>
</QuestionSet>

我想通过属性获得选项值,比如1、2、3和4。

如何在Linq中通过属性获取元素的值

var questions = from qs in xdoc.Descendants("QuestionSet")
                let options = qs.Element("Options").Elements()
                select new {
                  Question = (string)qs.Element("Question"),
                  Options = options.ToDictionary(o => (int)o.Attribute("number"),
                                                 o => (string)o)
                };

这将为集合中的每个问题返回匿名对象的集合。所有选项都将在一个以数字为关键字的字典中:

foreach (var question in questions)
{
    Console.WriteLine(question.Question);
    foreach (var option in question.Options)        
        Console.WriteLine("{0}: {1}", option.Key, option.Value); 
    // or ConsoleWriteLine(question.Options[2])       
}

如果你只想从这个特定的xml中选择:

var options = xdoc.Descendants("Option")
                  .ToDictionary(o => (int)o.Attribute("number"), o => (string)o);
Console.WriteLine(options[1]); // 10, 15
var d = new XmlDocument();
d.LoadXml("yuor document text");
d.ChildNodes.OfType<XmlElement>().SelectMany(root => root.ChildNodes.OfType<XmlElement>().Where(x => x.Name == "Options").SelectMany(options => options.ChildNodes.OfType<XmlElement>().Select (option => option.Attributes["number"].Value))).Dump();

它可能有点发红。也许最好使用foreach或XPATH//options/option["number"]-(XPATH查询可能是错误的)