XML LINQ查询不返回任何内容



我试图使用LINQ解析一个xml文件,但据我所知,查询返回null。(是WP7)这是代码:

var resultQuery = from q in XElement.Parse(result).Elements("Question")
select new Question
{
QuestionId = q.Attribute("id").Value,
Type = q.Element("Question").Attribute("type").Value,
Subject = q.Element("Subject").Value,
Content = q.Element("Content").Value,
Date = q.Element("Date").Value,
Timestamp = q.Element("Timestamp").Value,
Link = q.Element("Link").Value,
CategoryId = q.Element("Category").Attribute("id").Value,
UserId = q.Element("UserId").Value,
UserNick = q.Element("UserNick").Value,
UserPhotoURL = q.Element("UserPhotoURL").Value,
NumAnswers = q.Element("NumAnswers").Value,
NumComments = q.Element("NumComments").Value,
};

"result"是xml字符串,与此字符串类似。http://i48.tinypic.com/1ex5s.jpg(无法发布格式正确的文本,所以这里有一张图片:P)

错误:http://i48.tinypic.com/2uyk2ok.jpg

对不起,如果我没有正确解释,如果已经问过这个问题(尝试搜索但没有帮助)。

您遇到了一个XML命名空间问题。当您只是在查询"Question"时,字符串会被转换为具有默认名称空间的XName。XML中的默认名称空间中没有元素,只有urn:yahoo:answers名称空间中的元素(请参阅顶层元素,其中显示xmlns="urn:yahoo:answers")。

您需要查询正确的XML名称空间,如下所示:

var ns = new XNameSpace("urn:yahoo:answers");
var resultQuery = from q in XElement.Parse(result).Elements(ns + "Question");

在挑选单个属性时,请记住还要添加名称空间。

XName是一个表示XML名称的类,该名称可能具有由XNameSpace定义的名称空间。这两个类实现了一个隐式转换运算符,允许您从string隐式转换为XName。这就是调用只指定string名称,但仅当元素位于默认名称空间中时才起作用的原因。

这一点的隐含性使非常容易使用XML名称空间,但当人们不知道背后的机制时,它很快就会变得混乱。XName类文档中有一些优秀的示例。

修复它的两种方法:

  1. 添加根元素是一部分,因为元素只搜索一个级别-XElement.Parse(result).root.Elements("Question")
  2. 使用Descendants方法,因为这将搜索整个xml树

相关内容

  • 没有找到相关文章

最新更新