我尝试解析一个大型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']'的标记无效。
对我来说,它似乎是一个有效的XPath表达式,因为像XMLSpy这样的其他工具会成功地评估该表达式。
答案 0 :(得分: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
答案 1 :(得分:0)
如果你看一下http://www.w3.org/TR/xpath/#NT-Step的XPath规范,我们可以看到Step生产被定义为:
Step ::= AxisSpecifier NodeTest Predicate*
| AbbreviatedStep
换句话说,谓词不能遵循缩写步骤,例如。或者......我认为实施是(严格地)正确的。也许XMLSpy在解释上更加自由,并且总是将...扩展为parent:node()?