从xml文件接收错误代码值

时间:2013-02-11 12:14:12

标签: c# xml linq-to-xml

我敢肯定,这是一个简单的问题,但我心里真的有些困惑,无法找到解决方案。

我有一个非常简单的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。

3 个答案:

答案 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();