5

我尝试解析一个大型 XML 文件,并且我使用了很多 XPath 表达式的相对路径。

现在我遇到了 .net XPath 评估的问题。

这是一个解释我的问题的小例子:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
</book> 
</bookstore>

这是代码:

static void Main(string[] args)
{
    System.Xml.XmlDocument d = new System.Xml.XmlDocument();
    d.Load(@"D:\simpleXml.xml");

    System.Diagnostics.Trace.WriteLine(d.SelectSingleNode("//price/..[year=\'2005\']").Name);
}

我收到以下错误消息:附加信息:'//price/..[year='2005']' has an invalid token。

对我来说,这似乎是一个有效的 XPath 表达式,因为 XMLSpy 等其他工具成功地评估了该表达式。

4

2 回答 2

1

为什么不使用linq2xml

XDocument doc=XDocument.Load("yourXML");

var bookPrice=doc.Descendants("book")
.Where(x=>x.Element("year").Value=="2005")
.Select(y=>y.Element("price").Value);
//gets the price of the books published in 2005

如果你想要 xpath 版本,这里是

"bookstore/book[year='2005']/*/../price"
//gets the price of the books published in 2005
于 2012-10-22T14:53:34.597 回答
0

如果您查看http://www.w3.org/TR/xpath/#NT-Step上的 XPath 规范,我们可以看到 Step 生成定义为:

Step  ::=  AxisSpecifier NodeTest Predicate*    
         | AbbreviatedStep

换句话说,谓词不能跟在缩略步骤之后,例如 . 或..我会假设实施是(严格)正确的。也许 XMLSpy 在其解释上更自由一些,并且总是将 .. 扩展为 parent:node()?

于 2012-11-01T13:47:41.940 回答