我敢肯定,这是一个简单的问题,但我心里真的有些困惑,无法找到解决方案。
我有一个非常简单的xml,看起来像:
<xml-header>
<error code="40" message="errorMessage" />
</xml-header>
我需要从中获得“40”的价值。因此,在我看来,这意味着:从元素“错误”的属性“代码”中获取值。 (我是对的吗?)
return (from node in xdoc.Descendants() select node.Element("error").Attribute("code").Value).First();
这不起作用。什么是正确的表达?
[更新]
对不起大家,问题在于xNamespace。
所以它应该是这样的:xdoc.Descendants(Constants.xNamespace)
甚至在Constants类中有这个,aarrgh。
答案 0 :(得分:3)
选择后代错误元素。如果你不想在元素中没有这样的属性时得到异常,也要避免使用Value属性:
(from node in xdoc.Descendants("error")
select (int)node.Attribute("code"))
.First();
您还可以使用方法语法:
xdoc.Descendants("error")
.Select(e => (int)e.Attribute("code"))
.First()
请记住 - 如果序列不包含元素,First将抛出异常。如果您想避免该错误,请改用FirstOrDefault
。如果定义了名称空间,则在选择元素时使用它:
XNamespace ns = "http://someAdress";
xdoc.Descendants(ns + "error")
答案 1 :(得分:1)
尝试这样的事情(省略所有错误处理!):
using System;
using System.IO;
using System.Xml.Linq;
using System.Xml.XPath;
namespace Demo
{
public static class Program
{
private static void Main(string[] args)
{
string xml = "<xml-header><error code=\"40\" message=\"errorMessage\" /></xml-header>";
var element = XElement.Load(new StringReader(xml));
var errorElement = element.XPathSelectElement("error");
string code = errorElement.Attribute("code").Value;
Console.WriteLine(code); // Prints 40
}
}
}
或者,使用XDocument并避免扩展:
using System;
using System.IO;
using System.Xml.Linq;
namespace Demo
{
public static class Program
{
private static void Main(string[] args)
{
string xml = "<xml-header><error code=\"40\" message=\"errorMessage\" /></xml-header>";
var doc = XDocument.Load(new StringReader(xml));
var errorElement = doc.Element("xml-header").Element("error");
string code = errorElement.Attribute("code").Value;
Console.WriteLine(code); // Prints 40
}
}
}
答案 2 :(得分:1)
您的后代中已有error
个元素。
试试这个:
return xdoc.Descendants().Select(n => n.Attribute("code").Value).First();
或者,如果您喜欢查询样式:
return (from node in xdoc.Descendants() select node.Attribute("code").Value).First();