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

时间:2012-01-07 20:02:16

标签: c# xml linq nested-attributes

我有一个复杂的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的经验,任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

(我知道你的问题是“只返回第一个属性”,但那里只有一个属性 - 所以我正在回答你的隐含问题。)

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

答案 1 :(得分:0)

这是你在找什么?

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