2

我敢肯定,这是一个简单的问题,但我心里真的很模糊,找不到解决方案。

我有一个非常简单的 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) 即使在常量类中也有这个,aarrgh。

4

3 回答 3

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")
于 2013-02-11T12:49:02.737 回答
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
        }
    }
}
于 2013-02-11T12:27:31.193 回答
1

您已经error在后代中有元素。试试这个:

return xdoc.Descendants().Select(n => n.Attribute("code").Value).First();

或者这个,如果你喜欢查询风格:

return (from node in xdoc.Descendants() select node.Attribute("code").Value).First();
于 2013-02-11T12:28:19.387 回答