Daily Archives: October 12, 2007

ArcIMS ArcXML 元数据搜索中文关键词问题

或者在c#代码中直接用中文字符构建 SEARCH_METADATA将搜索失败,提示非法的ArcXML
解决方法是使用中文的unicode表示,即旞类似的方式
提供了一个转换函数:

/// <summary>
/// 将汉字变成 黑&27827;的ascii编码
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public static string UnicodeEncode(string text)
{
char[] chars = System.Web.HttpUtility.HtmlEncode(text).ToCharArray();
System.Text.StringBuilder result = new System.Text.StringBuilder(text.Length + (int)(text.Length * 0.1));

foreach (char c in chars)
{
int value = Convert.ToInt32(c);
if (value > 127)
result.AppendFormat("&#{0};", value);
else
result.Append(c);
}

return result.ToString();
}

ESRI本身提供的metadata explorer搜索中文关键词时有问题,是因为它的代码将中文解释成了 &amp;26789;类似,而不是梥,可能是将&再次解释了,搜索时将不返回结果。不知道9.1及以后版本的arcims metadata explorer里是否已经更正。

Gold Parser文本词法分析

在westdc的搜索输入字符串时用了一下Gold Parser,感觉真是个好东西,不过学起来有点费劲,花了我3天时间,才逐渐明白并动手做了一个比较简单的字串分析器。代码如下:

! GOLD Parser Builder
! Version 3.4.4
!
"Name" = "Simple search Grammer"
"Version" = "1.0"
"Author" = "Zhuotong Nan"

"Start Symbol" = <Query>

!—————–Sets
!Valid char for string keyword
{kw1} = {All Valid} – {Control Codes} – ["]

!Valid char for non-string keyword
{kw2} = {kw1} – {Whitespace} -[()]

!—————–Terminal

SimpleKw = {kw2}+
StringKw = ‘"’ {kw1}* ‘"’

!—————–Rules

<Keyword> ::= SimpleKw | StringKw

<Unit> ::= <Keyword>
| ‘(‘ <Query> ‘)’

<And> ::= <Query> <Unit>
| <Query> ‘and’ <Unit>

<Or> ::= <Query> ‘or’ <Unit>

<Query> ::= <And>
| <Or>
| <Unit>

支持 and, or查询,kw1 and kw2 可以省略为 kw1 kw2,支持括号优先级,支持""指定字串
通过CalithaLib engine连接到c#应用程序
语法并不复杂,但用于arcims的search_metadata比较别扭,如果将分析出来的keywords组织成arcims识别的search_metadata结构费了比较大的劲

中文搜索仍有问题,明天再检查,arcims是否有专门的设置没有。