如何在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。
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查询可能是错误的)