我正在尝试使用 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 命名空间问题。当您只是查询“问题”时,该字符串被翻译成 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
名称来工作的原因,但仅当元素位于默认 namespace 中时。
这种隐含性使得使用 XML namespace 非常容易更容易,但是当人们不知道背后的机制时,它很快就会变得困惑。 XName
class documentation有一些很好的例子。
关于c# - XML LINQ 查询不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874027/