Linq to XML检索单个节点

时间:2011-11-22 21:49:48

标签: c# xml linq linq-to-xml

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<game>
    <name>Space Blaster</name>
    <description></description>
    <version>1</version>
    <fullscreen>false</fullscreen>
    <width>640</width>
    <height>640</height>
    <c2release>6900</c2release>
</game>

保证只有1个游戏记录。我想检索每个属性值,这是我尝试过的:

string ArcadeXMLLocation = Settings.GamePergatoryLocation + UserID + "/unzipped/arcade.xml";
XDocument loaded = XDocument.Load(ArcadeXMLLocation);

var q = (from c in loaded.Descendants("game") select (string)c.Element("name")).SingleOrDefault();
Response.Write(q.name);

但我似乎无法接受这样的任何价值(intellisense讨厌它!)有人能告诉我它是如何完成的吗?

4 个答案:

答案 0 :(得分:2)

我认为您只需要获取元素的值:

string val = doc.Descendants("game")
    .Select(x => x.Element("name").Value).FirstOrDefault();

作为上述内容的先决条件,因此intellisense会选择它,请确保导入System.LinqSystem.Xml.Linq名称空间。

答案 1 :(得分:1)

这将为你带来所有带有“游戏”标签的后代 您只需要FirstOrDefault()来获取唯一的记录(如果存在)。

             var q = from c in loaded.Descendants("game")
                select new { Name = c.Element("name").Value
                             Description = c.Element("description").Value
                };

             q.FirstOrDefault();

答案 2 :(得分:1)

您的查询实际上是正确的(已经过测试并且适用于我),用于提取名称节点的 - 您正在执行的(string)强制转换将提取名称节点的值作为字符串,而不是给你节点对象本身,这是Linq到Xml内置的快捷方式之一。剩下的就是打印出名称:

Response.Write(q);

答案 3 :(得分:1)

var q = (from c in loaded.Descendants("game") select (string)c.Element("name")).SingleOrDefault();
Console.WriteLine(q);

就够了。或者避免演员

var q = (from c in loaded.Descendants("game") select c.Element("name").Value).SingleOrDefault();
Console.WriteLine(q);