// 将 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 }); }
// 将 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); }