为什么这个linq查询只返回第一个属性
本文关键字:返回 第一个 属性 查询 linq 为什么 | 更新日期: 2023-09-27 18:19:39
我有一个复杂的xml文件,在不同级别中可能存在以下部分:
<ChrNote>
<note>The appropriate character is:</note>
</ChrNote>
<ChrDef>
<extension char="A">initial</extension>
<extension char="D">subsequent</extension>
<extension char="G">subsequent delayed</extension>
<extension char="S">sequel </extension>
</ChrDef>
...
这是我用来构建文本文件的代码片段:
var lv1s = from lv1 in XMLDoc.Descendants("chapter").DescendantsAndSelf()
select new
{
SChar = (string)lv1.Element("ChrNote") ?? "",
SCharDef = (string)lv1.Element("ChrDef") ?? "",
//Returns only first attribute ..?
CharLetter = (lv1.Element("ChrDef") == null ? "" :
(string)(lv1.Element("ChrDef")
.Element("extension")
.Attribute("char")) ?? "")
};
问题是上述查询只返回元素"extension"的第一个属性("A")。我没有在林克的经验,任何帮助都将不胜感激。
(我知道你的问题说"只返回第一个属性",但那里只有一个属性——所以我回答你的隐含问题。)
它只返回第一个扩展元素,因为您使用的是Element("extension")
。如果你使用Elements("extension")
,你会得到其他的。
请参阅文档:
http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx
http://msdn.microsoft.com/en-us/library/bb348975.aspx
这就是您想要的吗?
var result = from x in XMLDoc.Descendants("chapter")
let Definitions = x.XPathSelectElements("ChrDef/extension")
select new
{
Note = x.XPathSelectElement("ChrNote/note") == null ? "" : x.XPathSelectElement("ChrNote/note").Value,
Definitions = Definitions.Select(y=> new { Extension = y.Value, Char = y.Attribute("char").Value })
};
Console.WriteLine ("{0}", result.First().Note);
foreach (var definition in result.First().Definitions)
{
Console.WriteLine ("{0}, {1}", definition.Extension, definition.Char);
}
这将为您提供以下输出:
The appropriate character is:
initial, A
subsequent, D
subsequent delayed, G
sequel , S