简单的Linq到Xml查询设置带元素的属性(而不是IEnumerable)

时间:2013-02-10 06:21:11

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

我正在尝试编写一个简单的Linq to Xml查询,将serverOpenonlinePlayers值提取到我的类中,该类分别有两个属性ServerStatusPlayers。 / p>

我正在处理的xml是这种简单的形式:

<eveapi version="2">
   <currentTime>2013-02-10 05:27:33</currentTime>
   <result>
     <serverOpen>True</serverOpen>
     <onlinePlayers>32723</onlinePlayers>
   </result>
   <cachedUntil>2013-02-10 05:28:39</cachedUntil>
</eveapi>

我觉得这应该是一个非常简单的解决方案。 XML中只有一个结果,我希望能够非常简单地查询它。

我尝试了类似的事情(Results是我在xDocument中的xml):

var result = Results.Elements().Elements().First(); //successfully gets result
ServerStatus = result.Element("serverOpen").Value;  //this doesn't work
                       //null reference exception with .Value

还有一些其他查询都返回IEnumerables,我从来没有能够成功提取值。

感谢。

3 个答案:

答案 0 :(得分:2)

在这里使用xpath会更容易一些,特别是如果没有结果的话。

var serverStatus = (bool?)doc.XPathSelectElement("/eveapi/result/serverOpen");
var onlinePlayers = (int?)doc.XPathSelectElement("/eveapi/result/onlinePlayers");

答案 1 :(得分:0)

好吧,我能够使用一个被忽略的XDocument方法Single()来获得单个result XElement。然后使用Element()result XElement中提取正确的XElements。

var result = Results.Descendants("result").Single();
ServerStatus = result.Element("serverOpen").Value;

如果有更好的方式或其他华丽的方式,请提交您自己的建议。

感谢。

答案 2 :(得分:0)

我不完全确定,但如果我正确理解Linq,你已经拥有了你的对象。 而不是:

ServerStatus = result.Element("serverOpen").Value;

做的:

ServerStatus = result.Value;

希望这有帮助。