XML LINQ查询什么都不返回

时间:2012-10-13 14:26:00

标签: c# xml linq null xelement

我正在尝试使用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

很抱歉,如果我没有正确解释它并且是否已经被问过(尝试搜索但没有帮助)。

2 个答案:

答案 0 :(得分:2)

您遇到了XML命名空间问题。当您只是查询“问题”时,字符串将被转换为具有默认命名空间的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命名空间,但是当一个人不知道背后的机制时,它会很快变得混乱。 XNameclass documentation有一些很好的例子。

答案 1 :(得分:0)

两种解决方法:

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