Пример #1
0
        // 将 XML 检索式变化为 Search() API 所用的检索式
        // 注: 这是一个辅助性方法,基本 Z39.50 功能可以不包含它。API 所用的检索式可以不必从 XML 检索式转换而来
        // parameters:
        //      strQueryXml XML 形态的检索式
        //      strQueryString [out] Search() 专用的检索式
        // result.Value
        //      -1  出错
        //      0   没有发生转换。例如 strQueryXml 为空的情况
        //      1   成功
        public static Result ConvertQueryString(
            UseCollection use_list,
            string strQueryXml,
            IsbnConvertInfo isbnconvertinfo,
            out string strQueryString)
        {
            strQueryString = "";

            if (String.IsNullOrEmpty(strQueryXml) == true)
            {
                return(new Result());
            }

            XmlDocument dom = new XmlDocument();

            try
            {
                dom.LoadXml(strQueryXml);
            }
            catch (Exception ex)
            {
                return(new Result {
                    Value = -1, ErrorInfo = "strQueryXml装入XMLDOM时出错: " + ex.Message
                });
            }

            XmlNodeList nodes = dom.DocumentElement.SelectNodes("line");

            foreach (XmlElement node in nodes)
            {
                string strLogic = node.GetAttribute("logic");
                string strWord  = node.GetAttribute("word");
                string strFrom  = node.GetAttribute("from");

                if (string.IsNullOrEmpty(strWord) == true)
                {
                    continue;   // 检索词为空的行会被跳过。
                }
                strLogic = GetLogicString(strLogic);

                if (strQueryString != "")
                {
                    strQueryString += " " + strLogic + " ";
                }

                int nRet = strFrom.IndexOf("-");
                if (nRet != -1)
                {
                    strFrom = strFrom.Substring(0, nRet).Trim();
                }

                string strValue = use_list.GetValue(strFrom);
                if (strValue == null)
                {
                    return new Result {
                               Value = -1, ErrorInfo = "名称 '" + strFrom + "' 在use表中没有找到对应的编号"
                    }
                }
                ;

                // 对ISBN检索词进行预处理
                if (strFrom == "ISBN" &&
                    isbnconvertinfo != null)
                {
                    // result.Value:
                    //      -1  出错
                    //      0   没有必要转换
                    //      1   已经转换
                    Result result = isbnconvertinfo.ConvertISBN(strWord,
                                                                out List <string> isbns);

                    if (result.Value == -1)
                    {
                        return new Result {
                                   Value = -1, ErrorInfo = "在处理ISBN字符串 '" + strWord + "' 过程中出错: " + result.ErrorInfo
                        }
                    }
                    ;

                    // 如果一个 ISBN 变成了多个 ISBN,要构造为 OR 方式的检索式。但遗憾的是可能有些 Z39.50 服务器并不支持 OR 运算检索
                    int j = 0;
                    foreach (string isbn in isbns)
                    {
                        if (j > 0)
                        {
                            strQueryString += " OR ";
                        }
                        // string strIsbn = isbn.Replace("\"", "\\\"");    // 字符 " 替换为 \"
                        string strIsbn = StringUtil.EscapeString(isbn, "\"/=");    // eacape 特殊字符

                        strQueryString += "\""
                                          + strIsbn + "\"" + "/1="
                                          + strValue;
                        j++;
                    }
                    continue;
                }

                // strWord = strWord.Replace("\"", "\\\""); // 字符 " 替换为 \"
                strWord         = StringUtil.EscapeString(strWord, "\"/="); // eacape 特殊字符
                strQueryString += "\""
                                  + strWord + "\"" + "/1="
                                  + strValue;
            }

            return(new Result
            {
                Value = 1
            });
        }
Пример #2
0
        // 将 XML 检索式变化为简明格式检索式
        // parameters:
        //      strQueryXml XML 形态的检索式
        //      strQueryString [out] Search() 专用的检索式
        // return:
        //
        public static int GetQueryString(
            FromCollection Froms,
            string strQueryXml,
            IsbnConvertInfo isbnconvertinfo,
            out string strQueryString,
            out string strError)
        {
            strError       = "";
            strQueryString = "";

            if (String.IsNullOrEmpty(strQueryXml) == true)
            {
                return(0);
            }

            XmlDocument dom = new XmlDocument();

            try
            {
                dom.LoadXml(strQueryXml);
            }
            catch (Exception ex)
            {
                strError = "strQueryXml装入XMLDOM时出错: " + ex.Message;
                return(-1);
            }

            XmlNodeList nodes = dom.DocumentElement.SelectNodes("line");

            foreach (XmlElement node in nodes)
            {
                string strLogic = node.GetAttribute("logic");
                string strWord  = node.GetAttribute("word");
                string strFrom  = node.GetAttribute("from");

                if (strWord == "")
                {
                    continue;
                }

                strLogic = GetLogicString(strLogic);    // 2011/8/30

                if (strQueryString != "")
                {
                    strQueryString += " " + strLogic + " ";
                }

                int nRet = strFrom.IndexOf("-");
                if (nRet != -1)
                {
                    strFrom = strFrom.Substring(0, nRet).Trim();
                }

                string strValue = Froms.GetValue(strFrom);
                if (strValue == null)
                {
                    strError = "名称 '" + strFrom + "' 在use表中没有找到对应的编号";
                    return(-1);
                }

                // 对ISBN检索词进行预处理
                if (strFrom == "ISBN" &&
                    isbnconvertinfo != null)
                {
                    /*
                     * // return:
                     * //      -1  出错
                     * //      0   没有必要转换
                     * //      1   已经转换
                     * nRet = isbnconvertinfo.ConvertISBN(ref strWord,
                     * out strError);
                     * if (nRet == -1)
                     * {
                     *  strError = "在处理ISBN字符串 '" + strWord + "' 过程中出错: " + strError;
                     *  return -1;
                     * }
                     * */
                    List <string> isbns = null;
                    // return:
                    //      -1  出错
                    //      0   没有必要转换
                    //      1   已经转换
                    nRet = isbnconvertinfo.ConvertISBN(strWord,
                                                       out isbns,
                                                       out strError);
                    if (nRet == -1)
                    {
                        strError = "在处理ISBN字符串 '" + strWord + "' 过程中出错: " + strError;
                        return(-1);
                    }

                    int j = 0;
                    foreach (string isbn in isbns)
                    {
                        if (j > 0)
                        {
                            strQueryString += " OR ";
                        }
                        // string strIsbn = isbn.Replace("\"", "\\\"");    // 字符 " 替换为 \"
                        string strIsbn = StringUtil.EscapeString(isbn, "\"/=");    // eacape 特殊字符
                        strQueryString += "\""
                                          + strIsbn + "\"" + "/1="
                                          + strValue;
                        j++;
                    }
                    continue;
                }

                // strWord = strWord.Replace("\"", "\\\""); // 字符 " 替换为 \"
                strWord         = StringUtil.EscapeString(strWord, "\"/="); // eacape 特殊字符
                strQueryString += "\""
                                  + strWord + "\"" + "/1="
                                  + strValue;
            }

            return(1);
        }