Berkeley DB XML 的PHP接口

预备知识:   Berkeley DB XML入门  

                                    图 BDB XML数据库示意图

1、主要的类

类名作用
XmlManager 用来创建、打开和维护containers,执行query,或者创建其他的BDB XML对象
XmlContainerontainer的句柄,提供方法来管理documents、indexes等等
XmlIndexSpecification可编程管理container的indexes的一个接口
XmlDocument container内的一个document,有获取和管理content的方法
XmlResults 记录查询结果的XmlValue序列
XmlModify 修改document的可编程接口
XmlQueryContext 用于查询,包含有namespace、变量绑定、flag等信息
XmlUpdateContext 包含更新container的context
XmlQueryExpression一个已经解析了的XQuery表达式
XmlTransactionBDB 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 = "<person><name>Bob</name></person>";
$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("<person><name>Bob2</name></person>");
$container->updateDocument($document, $ucontext);

用XmlModify修改documents:
用XmlModify这个类可以修改container中的document,并且不用替换这个document或者将它拷贝到内存中。你可以构造一系列的操作document中的content的步骤,然后构造好的Modify应用于多个documents。通过XmlManager::createModify()实例化一个XmlModify对象。它提供方法来添加、插入、替换content,重命名、移动nodes。
假设document的结构如下:
<person>
<name>Samuel</name>
<age>51</age>
</person>
想再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积分下载链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值