尽管有效的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> 
+0

结果集似乎是空的。也许一个名称空间相关的问题? – CodesInChaos 2012-02-07 14:52:53

问题是与命名空间 - 没有任何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。