Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何在 keys 配置文件中定义 operation 元素相关的检索点 #1200

Open
DigitalPlatform opened this issue Feb 27, 2025 · 1 comment

Comments

@DigitalPlatform
Copy link
Owner

DigitalPlatform commented Feb 27, 2025

数据库的 keys 配置文件负责定义检索点。

对于一些复杂的,无法用普通 XPATH 语句取出数据内容的 XML 结构,可以利用 key 配置文件中内嵌的 C# 脚本来实现数据内容取出的功能。

下面举例说明:

  1. 在 keys 配置文件中找到 script 元素,在里面适当位置增添一个函数:
	public void getMoveToMyselfOperator()
	{
		var nodes = this.DataDom.SelectNodes("//operations/operation[@name='move']");

                var operation_nodes = dp2StringUtil.MatchTargetRecPath(nodes, this.RecPath);
		var lines = dp2StringUtil.GetOperators(operation_nodes);

		if (lines.Count > 1)
		{
			this.ResultStrings = lines;
		}
		else if (lines.Count == 1)
			this.ResultString = lines[0];
	}

注意在脚本前部的 using 区域内,不要忘了添加一行:
(这是为了定义代码中用到的 dp2StringUtil 实用类的名字空间)

using DigitalPlatform.Text;

函数中,先通过 SelectNodes() 选出 name 属性符合要求的 operation 元素。这一步,得到的元素集合 nodes 中,包括各种源记录路径和目标记录路径的 operation 元素。
然后,对 nodes 集合进行进一步的筛选,通过 dp2StringUtil.MathTargetRecPath() 函数,把符合目标记录路径要求的 operation 元素筛选出来,放入 operation_nodes 集合中。注意,this.RecPath 是一个环境变量,内容为当前这一条记录的路径。
最后,用 dp2StringUtil.GetOperators() 函数进一步把 operation_nodes 这个元素集合中的 operator 属性内容提取出来,放到 lines 字符串集合中。注意,根据数据记录的实际情况,lines 集合中可能为零个、一个或者多个元素。
在返回给宿主的时候,要根据这个字符串集合的元素数量区分一下,只有一个元素,就返回给 this.ResultString;多个元素,就返回给 this.ResultStrings。注意最后一个 s 字母的差异,两个变量是不同的变量。(注: 样例代码这里主要是示范多样性用法,其实不管一个还是多个字符串的集合,都直接赋值给 this.ResultStrings 这个变量也是完全可以的)

  1. 在 keys 配置文件中找到适当位置,插入 key 和 table 元素,片段如下:
	<key>
		<xpath scripting="on">getMoveToMyselfOperator</xpath>
		<from>moveoperator</from>
		<table ref="moveoperator" />
	</key>
	<table name="moveoperator" id="300" type="moveoperator">
		<convert>
			<string style="" />
		</convert>
		<convertquery>
			<string style="" />
		</convertquery>
		<caption lang="zh-CN">最近移动操作者</caption>
		<caption lang="en">Recently Move Operator</caption>
	</table>

可以看出,key/xpath 元素不像平时那样定义 XPATH,而是添加了一个 scripting="on" 元素,那么 path 元素中的文本就是一个函数名,函数通过上一步骤已经定义在 script 元素内的 C# 代码中了。

思考

上面的示范代码中,可能会得到一个或者多个 operation 元素的 operator 属性,也就是说同一条记录会创建“最近移动操作者”的多个检索点 key。

如果希望最多只创建一个检索点 key 要怎么做呢?可以在得到 lines 以后,只取最后一个元素,放入 this.ResultString 环境变量,就可以达到目的。这就是真正的“最近移动操作者”。

(注: 数据记录中 operations 元素下的多个 operation 元素,较新的会靠后创建)

扩展

根据实际业务需要,如果发现 dp2StringUtil 实用类里面的函数不够用,可以反馈给我们,我们进行适当扩展。也可以在 keys 里面的 C# 脚本中直接书写代码实现具体 XML 操作功能,而不用 dp2 的函数库。

@DigitalPlatform
Copy link
Owner Author

附件: 关于 keys 配置文件中两种不同的 C# 脚本代码定制方法

key 配置文件中提供了两种经典的 C# 脚本代码定制方法,分别是“字符串变换”和“从 XmlDocument 中获得和创建内容”。分别适应于不同的场景。

字符串变换

这种用法,适应于那些可以利用 keys 配置文件中的 xpath 元素直接以 XPATH 定义内容抽取规则,但内容抽取出来以后需要进一步稍作变换的场景。

KeysHost 类型里面有个 InputString 成员,是宿主在触发创建检索点之前预先准备好的,根据 xpath 元素中的 XPATH 初步抽取出来的字符串。脚本函数需要对 InputString 中的内容进行一定变换加工,然后赋值给 ResultString 或者 ResultStrings 中。如果加工的结果是一个字符串,就放到 ResultString 中;如果是多个字符串,就可以作为一个集合放到 ResultStrings 中。

举例:...

从 XmlDocument 中获得和创建内容

这种用法,适应于那些不方便利用 key 配置文件中的 xpath 元素直接以 XPATH 定义内容抽取规则的场合。

KeysHost 类型里面有个 DataDom 成员,是宿主在触发创建检索点之前预先准备好的,存储了当前记录 XML 内容的 XmlDocument 类型对象。

我们可以自由地用各种方法,从 DataDom 中抽取任何数据。最后赋值给 ResultString 或者 ResultStrings。

举例:...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant