尽管有效的XPath查询,iterator.MoveNext()仍然返回false
问题描述:
我在做这个XPath查询时出错了吗?在Feed标签中,有多个条目标签。 XML是有效的,生成的XPath查询也是有效的,我已经用一个名为XPath Visualizer的工具一起进行了测试。尽管有效的XPath查询,iterator.MoveNext()仍然返回false
对iterator.MoveNext()的调用返回false,操作之后迭代器仍在根节点上。我在这里错过了很明显的东西吗
var stringReader = new StringReader(importData.Trim());
var xpathDoc = new XPathDocument(stringReader);
XPathNavigator xPathNav = xpathDoc.CreateNavigator();
string xPathString = "//" + masterNode; // Evaluates to '//entry'
XPathExpression xPathExpr = xPathNav.Compile(xPathString);
XPathNodeIterator iterator = xPathNav.Select(xPathExpr);
while (iterator.MoveNext())
{
....
示例XML
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
<title>Test</title>
<link rel="self" href="http://store.Test.com"/>
<updated>2012-02-07T11:15:04Z</updated>
<author>
<name>Test</name>
</author>
<id>tag:000000</id>
<entry>
<title><![CDATA[Example 7500cl]]></title>
<link><![CDATA[http://store.test.com/example-75cl/]]></link>
<description><![CDATA[example descr........]]></description>
</entry>
答
问题是与命名空间 - 没有任何entry
元素没有命名空间 - 你可以看到该元素具有“http://www.w3.org/2005/Atom“命名空间从根继承。
就我个人而言,我会用LINQ to XML代替它,但如果你必须使用XPath,则需要使用命名空间管理器来查找具有特定命名空间的元素。在Stack Overflow中搜索“xpath namespace .net”会给你带来很多选项。
的LINQ到XML的代码应该是这样的:
XDocument doc = XDocument.Parse(importData.Trim());
XNamespace ns = "http://www.w3.org/2005/Atom";
var entries = doc.Descendants(ns + "entry");
foreach (var entry in entries)
{
...
}
+0
+1,+答案。谢谢,这是问题。 – gb2d 2012-02-07 15:58:01
答
所有我能想到的是添加的XmlNamespaceManager。
结果集似乎是空的。也许一个名称空间相关的问题? – CodesInChaos 2012-02-07 14:52:53