为什么这个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")。我没有在林克的经验,任何帮助都将不胜感激。

为什么这个linq查询只返回第一个属性

(我知道你的问题说"只返回第一个属性",但那里只有一个属性——所以我回答你的隐含问题。)

它只返回第一个扩展元素,因为您使用的是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