天天看點

通過z39.50協定用YAZ軟體擷取Marc資料(JAVA版)

通過z39.50協定用YAZ軟體擷取Marc資料(JAVA版)

目前網上沒有找到相關正式可用的例子,于是自己花了一星期去看文檔和前人寫的例子(都是10多年前的文章和資源),分享給大家,希望後來的和我一樣的菜鳥能用到

  • 配置環境:安裝yaz軟體。官網:https://www.indexdata.com/resources/software/yaz/下載下傳對應的版本後無腦安裝就可以了。
  • 建立java項目,導入jar包,安裝好的YAZ目錄下有一個java檔案項,裡面有jar包。
  • 編寫類就可以了。

    1.建立連接配接對象:需要位址和端口

    2.設定連接配接的一些參數:密碼,使用者名,資料庫名,查詢方式

    3.定義查詢語句

    4.連接配接(查詢語句)

    5.接收結果

    6.取出内容

    7.關閉連接配接

public List<String> CNmarc(String host,int port,String username,
			String password,String datebase){
		Connection c=null; //聲明連接配接
		Query q=null; //聲明查詢
		int n=0; // 聲明嘗試次數
		List<String> list =new ArrayList<String>(); // 傳回的集合
           
try {
			c=new Connection(host, port);
			  //possibly set some options       可能設定一些選項
			c.option("elementSetName","F"); //設定簡單或者複雜資料查詢:  B or  F  -- 簡單 or  複雜
			c.setDatabaseName(datebase);
			c.setUsername(username);
			c.setPassword(password);
			c.setSyntax("Unimarc");//資料格式
			c.connect(); //establishes connection 建立連接配接
			//查詢語句
			StringBuilder queryBuilder = new StringBuilder();
            queryBuilder.append("@attr 1=7 ");//isbn 号 帶不帶  -  都可以(自己測試的結果)
          //978-7-5463-4045-6 西遊記的   //9787508690254   行為設計學的
            queryBuilder.append("\"" +"9787508690254"+ "\"");
            Query query =new PrefixQuery(queryBuilder.toString());//建立查詢類型和語句填充
            ResultSet set=c.search(query);//查詢,并接收查詢結果集
         /*測試時: 單取第一條
            byte[] b=set.getRecord(0).getContent();//取第一條結果集
            String st1 =new String(b,"gbk");//以gbk編碼格式展示
         //   String st2=set.getRecord(0).render();//取出結果集第一條并斷句展示(但是格式預設是gbk(或者擷取的預設編碼),無法再轉碼,如果你的程式是utf-8或者其他編碼格式,會出現亂碼)
			System.out.println("共:"+set.getHitCount()+"條");
			System.out.println("結果:"+st1);
		*/
            
			for(int i =0; i<set.getHitCount();i++){
				byte[] b=set.getRecord(i).getContent();
				String st1;
				try {
					st1 = new String(b,"gbk");
					list.add(st1);
				} catch (UnsupportedEncodingException e) { 
					//編碼轉化失敗
				}
			}
		}catch (ZoomException e) {
			  //handle any protocol- or network-level errors
			//連接配接時有時會逾時異常,解決辦法:再次調用,并計數,超次數傳回 空集合
			if(n<5) {
				n=n+1;//計數一次
				CNmarc(host,port,username,password,datebase);
			}else {
				return list;
			}
		} finally {
			  c.close(); //close the socket 關閉連接配接
			 }
		return list;
	
           

不會可以下載下傳我的例子看(例子也差不多,類就是這個類),沒有币的可以私聊我,qq:1157673954

分享一下文檔:

資料參考:

http://zoom.z3950.org/api/zoom-1.4.html zoom文檔

https://www.indexdata.com/resources/software/yaz/ YAZ官網

https://software.indexdata.com/yaz4j/site/apidocs/index.html jar文檔

https://software.indexdata.com/yaz/doc/ YAZ文檔

(外國兄弟文檔寫的真的爛…我tm讀了一星期都沒看懂什麼玩意)