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