2011-11-22 149 views
0

我有下面的XML:的LINQ to 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); 

但我似乎无法采取任何像这样的值(智能感知讨厌它!)有人能告诉我它是如何做?

回答

2

我想你只需要获得该元素的值:

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

至于上述的前提条件,因此智能感知将它拾起,请确保您导入System.LinqSystem.Xml.Linq命名空间。

1

这会让你的所有后代的标签“游戏” 你只需要FirstOrDefault()来获得唯一的记录,如果它存在。

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

      q.FirstOrDefault(); 
1

您查询确实是正确的(测试工作对我来说)用于提取名称节点的 - 在(string)投,你正在做将提取名节点的值作为字符串,而不是给你是节点对象本身,这是Linq到Xml内置的快捷方式之一。所有剩下的就是打印出来的名字:

Response.Write(q); 
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);