支持 XPath 3.1 的 .Net 标准库
.Net standard library that supports XPath 3.1
我正在维护我工作的公司用 C# 编写的遗留工具,并将其转换为 .Net 标准 2.0。它使用 Saxon-HE 处理器来处理一些 XPaths 并替换文件中的一些配置。
它在 .NET 上的 NuGet package 具有不允许在所有 .Net 标准 2.0 兼容平台(在我的例子中是 .Net Framework 和 .Net core)上执行的依赖项,所以我需要用另一个工具替换它, 如果是标准的 .Net XPath 库就更好了。
问题是该工具使用了一些执行复杂操作的 XPath,例如连接字符串和 select 数组项,我不知道它是 Saxon 特定的语法还是标准。
了解这一点很重要,因为如果 XPath 符合某些 XPath 标准,我可以找到另一种方法来处理相同的 XPath。
这里有一些例子:
第一个:
for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))
第二个:
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]
您了解这种 XPath 语法吗?
谢谢
您作为示例给出的 XPath 表达式需要 XPath 2.0 处理器,但它们并非特定于 Saxon。
表达式
for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))
是一个ForExpression
,它是XPath 2.0特有的,不容易转换为XPath 1.0,因为它的结果是一个字符串序列,而XPath 1.0中没有这种数据类型。
表达式
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]
特定于 XPath 2.0,因为它在“/”运算符的 RHS 上使用带括号的表达式;再一次,因为它 returns 一个字符串序列。
恐怕我无法告诉您 .NET Core 上是否存在 运行 的 XPath 2.0 库,我认为这是您的要求。 Saxon 无法在 .NET Core 上实现 运行,因为它依赖于 IKVM,IKVM 不支持该平台,并且(我收集的)不能轻易适应这样做。
请注意,XPath 2.0 是 XQuery 1.0 的一个子集,因此您可以将搜索扩展到 XQuery 1.0 处理器以及 XPath 2.0 处理器。
感谢 comment I was able to test XPath2.Net,现在一切正常。我只需要更改一种类型的 XPath 定义
这个:
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]
更改为
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(.), '')[1]
请注意 string()
函数的附加点参数。
这很奇怪,因为它不应该需要点;事实上,根据 standard
In the zero-argument version of the function, $arg defaults to the
context item. That is, calling fn:string() is equivalent to calling
fn:string(.)
但是 XPath2 抱怨这个错误
{"The function 'string'/0 was not found in namespace 'http://www.w3.org/2003/11/xpath-functions'"}
更新:
将 XPath2.Net 库更新到版本 1.0.8 后,string()
语法有效。
我正在维护我工作的公司用 C# 编写的遗留工具,并将其转换为 .Net 标准 2.0。它使用 Saxon-HE 处理器来处理一些 XPaths 并替换文件中的一些配置。 它在 .NET 上的 NuGet package 具有不允许在所有 .Net 标准 2.0 兼容平台(在我的例子中是 .Net Framework 和 .Net core)上执行的依赖项,所以我需要用另一个工具替换它, 如果是标准的 .Net XPath 库就更好了。
问题是该工具使用了一些执行复杂操作的 XPath,例如连接字符串和 select 数组项,我不知道它是 Saxon 特定的语法还是标准。
了解这一点很重要,因为如果 XPath 符合某些 XPath 标准,我可以找到另一种方法来处理相同的 XPath。
这里有一些例子:
第一个:
for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))
第二个:
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]
您了解这种 XPath 语法吗?
谢谢
您作为示例给出的 XPath 表达式需要 XPath 2.0 处理器,但它们并非特定于 Saxon。
表达式
for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))
是一个ForExpression
,它是XPath 2.0特有的,不容易转换为XPath 1.0,因为它的结果是一个字符串序列,而XPath 1.0中没有这种数据类型。
表达式
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]
特定于 XPath 2.0,因为它在“/”运算符的 RHS 上使用带括号的表达式;再一次,因为它 returns 一个字符串序列。
恐怕我无法告诉您 .NET Core 上是否存在 运行 的 XPath 2.0 库,我认为这是您的要求。 Saxon 无法在 .NET Core 上实现 运行,因为它依赖于 IKVM,IKVM 不支持该平台,并且(我收集的)不能轻易适应这样做。
请注意,XPath 2.0 是 XQuery 1.0 的一个子集,因此您可以将搜索扩展到 XQuery 1.0 处理器以及 XPath 2.0 处理器。
感谢
这个:
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]
更改为
/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(.), '')[1]
请注意 string()
函数的附加点参数。
这很奇怪,因为它不应该需要点;事实上,根据 standard
In the zero-argument version of the function, $arg defaults to the context item. That is, calling fn:string() is equivalent to calling fn:string(.)
但是 XPath2 抱怨这个错误
{"The function 'string'/0 was not found in namespace 'http://www.w3.org/2003/11/xpath-functions'"}
更新:
将 XPath2.Net 库更新到版本 1.0.8 后,string()
语法有效。