我正在尝试使用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
很抱歉,如果我没有正确解释它并且是否已经被问过(尝试搜索但没有帮助)。
答案 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命名空间,但是当一个人不知道背后的机制时,它会很快变得混乱。 XName
class documentation有一些很好的例子。
答案 1 :(得分:0)
两种解决方法: