Berkeley DB XML 的PHP接口

预备知识:   Berkeley DB XML入门  

                                    图 BDB XML数据库示意图

1、主要的类

类名 作用
XmlManager 用来创建、打开和维护containers,执行query,或者创建其他的BDB XML对象
XmlContainer ontainer的句柄,提供方法来管理documents、indexes等等
XmlIndexSpecification 可编程管理container的indexes的一个接口
XmlDocument container内的一个document,有获取和管理content的方法
XmlResults 记录查询结果的XmlValue序列
XmlModify 修改document的可编程接口
XmlQueryContext 用于查询,包含有namespace、变量绑定、flag等信息
XmlUpdateContext 包含更新container的context
XmlQueryExpression 一个已经解析了的XQuery表达式
XmlTransaction BDB XML的transaction对象
XmlValue 接收和存储数据时用来保存XML节点值
Db4Env 管理数据库环境


2、详解&代码示例

创建一个container:

$mgr = new XmlManager();//实例化一个XmlManager
$mgr->createContainer("test.dbxml");//创建一个container,保存为test.dbxml


将一个本地文件的内容当做一个document添加到container中:

$mgr = new XmlManager();
$container = $mgr->openContainer("test.dbxml");//打开一个container
$xmlinput = $mgr->createLocalFileInputStream("cd_catalog.xml");//将一个本地文件转化成一个输入流
$container->putDocument("cd_catalog",$xmlinput);//将输入流添加到container中作为一个document

查询:

XmlManager::prepare()的参数是,XQuery表达式和一个query context对象,返回一个XmlQueryExpression对象,这个对象是解析和优化过后的XQuery表达式,可以在之后的操作中重复使用。execute()方法对container或者documents进行查询。XmlQueryContext对象包含有namespace、变量绑定、flag等信息。下面是XmlQueryContext的创建和使用方法。除了设置名字空间和变量等,还能设置查询类型。
$mgr = new XmlManager();
$query = "collection()/person[name='Bob']";
$container = $mgr->openContainer("test.dbxml");
$qcontext = $mgr->createQueryContext();//创建一个XmlQueryContext对象
$qcontext->setDefaultCollection("test.dbxml");//设置默认的collection()的参数
$qcontext->setNamespace("people", "http://brians.org/people/");//设置名字空间
$qcontext->setVariableValue("name", new XmlValue("Bob"));//设置变量的值
$query_exp = $mgr->prepare($query, $qcontext);
$results = $query_exp->execute($qcontext);
prepare后的XQuery表达式可以重复使用,如果一个查询不会重复使用,可以采用一种一次性的查询方式。使用XmlManager的query()方法。
$mgr = new XmlManager();
$query = "collection('test.dbxml')/person[name='Jim']";
$container = $mgr->openContainer("test.dbxml");
$results = $mgr->query($query, $qcontext);

使用查询结果:

XmlQueryExpression::execute()和XmlManager::query()两个方法返回XmlResults对象。用next()和previous()方法来取出XmlResults中的值XmlValue。XmlValue提供方法asString()和asDocument()将XmlValue转化成不同的形式。
$mgr = new XmlManager();
$query = "collection('test.dbxml')//Word";
$container = $mgr->openContainer("test.dbxml");
$qcontext = $mgr->createQueryContext();
$results = $mgr->query($query, $qcontext);
while ($results->hasNext()) {
$value = $results->next();
$document = $value->asDocument();
$name = $document->getName();
$content = $value->asString();
print $name . ": " . $content . "\n";
}

使用XmlContainer:

XmlContainer类提供了关于container和它的contents的大部分方法,包括对documents的添加、替换、更新、获取、删除和对indexes的管理。
前面的已经讲到XmlContainer对象通过XmlManager::createContainer()和XmlManager::openContainer()来实例化。用putDocument()方法将XmlDocument或者XmlInputStream作为Documents添加到Container。

删除documents:

将documents从一个container中删除使用XmlContainer::deleteDocument(),表示要删除的documents的参数可以是documents的名字或者是documents对象。
$mgr = new XmlManager();
$container = $mgr->openContainer("test.dbxml");
$ucontext = $mgr->createUpdateContext();
$qcontext = $mgr->createQueryContext();
$content = "Bob";
$container->putDocument("", $content, $ucontext, DBXML_GEN_NAME);//DBXML_GEN_NAME选项可以让DB自动生成documents的名字
$results = $mgr->query("collection('test.dbxml')/person[name='Bob']", $qcontext);
while ($results->hasNext()) {
$value = $results->next();
$document = $value->asDocument();
$container->deleteDocument($document, $ucontext);
}

替换一个documents:

用XmlContainer::updateDocument()来替换一个document。我们通常从数据库中用getDocument()获取一个document,然后用XmlDocument::setContent()或者setContentAsInputStream()来改变document的内容,最后用XmlContainer::updateDocument存回数据库。
$mgr = new XmlManager();
$container = $mgr->openContainer("test.dbxml");
$ucontext = $mgr->createUpdateContext();
$document = $container->getDocument("file12.xml");
$document->setContent("Bob2");
$container->updateDocument($document, $ucontext);

用XmlModify修改documents:

用XmlModify这个类可以修改container中的document,并且不用替换这个document或者将它拷贝到内存中。你可以构造一系列的操作document中的content的步骤,然后构造好的Modify应用于多个documents。通过XmlManager::createModify()实例化一个XmlModify对象。它提供方法来添加、插入、替换content,重命名、移动nodes。
假设document的结构如下:

Samuel
51
想再name中增加属性“type”和“given”“,用函数XmlModify::addApendStep()可以实现,代码如下:
$mgr = new XmlManager();
$container = $mgr->openContainer("test.dbxml");
$qcontext = $mgr->createQueryContext();
$ucontext = $mgr->createUpdateContext();
$modify = $mgr->createModify();
$queryexp = $mgr->prepare("/person/name", $qcontext);
$modify->addAppendStep($queryexp, XmlModify_Attribute, "type", "given");
$document = $container->getDocument("file14");
$doc_value = new XmlValue($document);
$modify->execute($doc_value, $qcontext, $ucontext);

参考文献:

[1] The.Definitive.Guide.to.Berkeley.DB.XML  0积分下载链接

你可能感兴趣的:(web技术)