C#中的字符串连接和标记化xpath函数

时间:2014-02-19 15:37:21

标签: c# xml xpath xpathnavigator

对于ASP.NET项目,我编写了一个控制器操作和一个表单,用户可以在其中输入xpath表达式并从服务器上的xml文件中检索结果。 它工作正常,即使有一些字符串函数,如concat,substring-before和substring-after。

为了摆脱输出中的一些逗号,我尝试使用string-join和tokenize。但是,通过使用其中一个函数,我最终得到了一个XPathException。

XPathDocument doc = new XPathDocument(@"C:\temp.xml");
XPathNavigator navigator = doc.CreateNavigator();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(navigator.NameTable);
nsmgr.AddNamespace("x", "systemInfo");
var temp = navigator.Evaluate("string-join(tokenize('The quick brown fox', ' '), ';')", nsmgr); // Exception

我没有正确使用这些xpath函数吗?

2 个答案:

答案 0 :(得分:2)

string-jointokenize是XPath 2.0函数,但.net的XPathNavigator仅支持XPath 1.0。您不能使用这些函数,并且没有XPath 1.0等效函数。

要么在C#中执行XPath外部的字符串操作,要么使用扩展功能的库,您可能需要查看{C}提供API的SaxonBaseX。还有一些,包括开源和商业。

针对此特定示例的XPath 1.0 hack:translate('The quick brown fox', ' ', ';')将使用分号替换所有出现的空格。

答案 1 :(得分:2)

您需要查看第三方解决方案,如.NET版本的Saxon 9或XmlPrime。 XmlPrime的API接近原始的Microsoft,请参阅http://www.xmlprime.com/xmlprime/doc/2.9/T_XmlPrime_ExtensionMethods_XPathNavigatorExtensions.htm,它添加了扩展方法以允许XPath 2.0评估。