天天看点

通过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读了一星期都没看懂什么玩意)