XML DataBase之Xindice(二)
2011-07-26 18:34 shy.ang 阅读(438) 评论(0) 编辑 收藏 举报Xindice编程
Xindice提供了对Java的编程接口:XML:DB API,由XML:DB Initiative开发,类似于关系数据库的JDBC。其他语言也可以使用XML-RPC API。
所有的xindice实例都有一个唯一的根collection名字,一般默认为db,但如果有两个xindice实例,那就需要改变其中一个名字(根据system.xml中的提示,去掉注释)。
上一段简单代码吧:
/**
* 在Xindice相关jar文件被装载的时候,会出现XMLDBException,errcode为400,no such database。
* 这可能是因为jar文件的位置问题,当从Xindice安装目录中提取jar文件时,正常运行;
* 而当提取其他位置的Xindice的jar文件时,就会出现上述问题。
*/
package org.apache.xindice.shy.test;
import org.xmldb.api.*;
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
publicclass Test_addressbook {
publicstaticvoid main(String[] args)throws Exception{
Collection col =null;
try {
String driver ="org.apache.xindice.client.xmldb.DatabaseImpl";
Class<?> c = Class.forName(driver);
Database database = (Database)c.newInstance();
DatabaseManager.registerDatabase(database);
String uri ="xmldb:xindice://localhost:8080/db/addressbook";
col = DatabaseManager.getCollection(uri);
if(col!=null){
String xpath ="//person[fname='John']";
XPathQueryService service =
(XPathQueryService) col.getService("XPathQueryService", "1.0");
ResourceSet resultSet = service.query(xpath);
ResourceIterator results = resultSet.getIterator();
while(results.hasMoreResources()){
Resource res = results.nextResource();
System.out.println((String)res.getContent());
}
}else{
System.out.println("The collection doesn't exist.");
}
}catch(XMLDBException e){
System.err.println("XML:DB Exception 发生了"+e.errorCode);
}finally{
if(col!=null){
col.close();
}
}
}
}
Services提供了XML:DB API的扩展,要获得一个服务,需要知道服务的名字和版本,通过collection的getService(name,version)方法获得。
Resources提供了访问潜在的XML数据比如文本、DOM节点的抽象方法。Xindice只支持XMLResource。在例子中接触了文本内容,但也可以调用getContentAsDom()方法访问DOM节点内容。文本内容比较容易处理的。比如
XPathQueryService
XUpdateQueryService
CollectionManagementService
还有不属于XML:DB但被Xindice支持的有:
DatabaseInstanceManager
CollectionManager
最后的col.close()千万不能忘记,否则会造成资源泄露。