迭代器.MoveNext()返回false,尽管XPath查询有效
本文关键字:尽管 XPath 查询 有效 false MoveNext 返回 迭代器 | 更新日期: 2023-09-27 18:23:51
这个XPath查询出了什么问题?在提要标记中,有多个条目标记。XML是有效的,生成的XPath查询也是有效的,我已经用一个名为XPathVisualizer的工具对两者进行了测试。
对迭代器的调用。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)
{
...
}
我所能想到的就是添加一个XmlNamespaceManager。