C# 从xml文件接收错误代码值

C# 从xml文件接收错误代码值,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我敢肯定,这是一个简单的问题,但我心里真的很模糊,找不到解决办法 我有一个非常简单的xml,它看起来像: <xml-header> <error code="40" message="errorMessage" /> </xml-header> 这是行不通的。正确的表达是什么 [更新] 对不起,各位,问题出在xNamespace上 所以它应该是这样的:xdoc.subjects(Constants.xNamespace)甚至在Constan

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

我有一个非常简单的xml,它看起来像:

  <xml-header>
   <error code="40" message="errorMessage" /> 
  </xml-header>
这是行不通的。正确的表达是什么


[更新]

对不起,各位,问题出在xNamespace上

所以它应该是这样的:
xdoc.subjects(Constants.xNamespace)
甚至在Constants类中有这个,aarrgh。

试试这样的方法(所有错误处理都省略了!):

使用系统;
使用System.IO;
使用System.Xml.Linq;
使用System.Xml.XPath;
名称空间演示
{
公共静态类程序
{
私有静态void Main(字符串[]args)
{
字符串xml=”“;
var元素=XElement.Load(新的StringReader(xml));
var errorElement=element.XPathSelectElement(“错误”);
字符串代码=errorElement.Attribute(“代码”).Value;
Console.WriteLine(代码);//打印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
        }
    }
}
使用系统;
使用System.IO;
使用System.Xml.Linq;
名称空间演示
{
公共静态类程序
{
私有静态void Main(字符串[]args)
{
字符串xml=”“;
var doc=XDocument.Load(新的StringReader(xml));
var errorElement=doc.Element(“xml头”).Element(“错误”);
字符串代码=errorElement.Attribute(“代码”).Value;
Console.WriteLine(代码);//打印40
}
}
}

子体中已经有
错误
元素。 试试这个:

return xdoc.Descendants().Select(n => n.Attribute("code").Value).First();
或者,如果您喜欢查询样式:

return (from node in xdoc.Descendants() select node.Attribute("code").Value).First();
选择子代错误元素。另外,如果您不想在元素中没有此类属性时获得异常,请避免使用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")

“不起作用”==你有例外吗?或者结果与您预期的不同?实际上,我自己的表达式和您的表达式中都有NullReferenceException。@请看。这段代码有什么问题?我使用的是Windows Phone,它的框架中似乎没有XPathSelectElement方法。我需要一个XDocument对象的解决方案,不想从字符串强制转换/解析它。我在回答中附加了一个与XDocument一起使用并避免扩展方法的版本。是的,我得到了。现在我有了“sequence contains no elements”。@Olter这就是我在
请记住
part:)中写的内容,看起来xml中没有
error
元素。你确定没有定义名称空间吗?该死!我怎么会错过呢?而且,最愚蠢的是,我在问题更新中写了这个名称空间,但由于某种原因它没有被打印出来。谢谢。@Olter我已经在Linq中添加了名称空间使用示例:)
xdoc.Descendants("error")
    .Select(e => (int)e.Attribute("code"))
    .First()
XNamespace ns = "http://someAdress";
xdoc.Descendants(ns + "error")