<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle Berkeley DB 中国研发团队的博客 &#187; Berkeley DB XML</title>
	<atom:link href="http://www.bdbchina.com/category/berkeley-db-xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Fri, 09 Jul 2010 06:44:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Berkeley DB XML 多线程添加文档例子</title>
		<link>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/</link>
		<comments>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 06:56:02 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Ying Cai]]></category>
		<category><![CDATA[蔡瀛]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=809</guid>
		<description><![CDATA[
import java.io.File;
import java.util.concurrent.CountDownLatch;

import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockDetectMode;
import com.sleepycat.dbxml.XmlContainer;
import com.sleepycat.dbxml.XmlContainerConfig;
import com.sleepycat.dbxml.XmlDocument;
import com.sleepycat.dbxml.XmlDocumentConfig;
import com.sleepycat.dbxml.XmlException;
import com.sleepycat.dbxml.XmlManager;
import com.sleepycat.dbxml.XmlManagerConfig;
import com.sleepycat.dbxml.XmlQueryContext;
import com.sleepycat.dbxml.XmlResults;
import com.sleepycat.dbxml.XmlTransaction;
import com.sleepycat.dbxml.XmlUpdateContext;

public class DbxmlThreads extends Thread {

        public static XmlManager mgr = null;
        public static String containerName = "test.dbxml";
        [...]]]></description>
			<content:encoded><![CDATA[<pre name="code" class="java:nogutter">
import java.io.File;
import java.util.concurrent.CountDownLatch;

import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockDetectMode;
import com.sleepycat.dbxml.XmlContainer;
import com.sleepycat.dbxml.XmlContainerConfig;
import com.sleepycat.dbxml.XmlDocument;
import com.sleepycat.dbxml.XmlDocumentConfig;
import com.sleepycat.dbxml.XmlException;
import com.sleepycat.dbxml.XmlManager;
import com.sleepycat.dbxml.XmlManagerConfig;
import com.sleepycat.dbxml.XmlQueryContext;
import com.sleepycat.dbxml.XmlResults;
import com.sleepycat.dbxml.XmlTransaction;
import com.sleepycat.dbxml.XmlUpdateContext;

public class DbxmlThreads extends Thread {

        public static XmlManager mgr = null;
        public static String containerName = "test.dbxml";
        public static Environment dbEnv = null;
        private static XmlContainer cont = null;

        static {
                EnvironmentConfig envConf = new EnvironmentConfig();
                envConf.setThreaded(true);
                envConf.setAllowCreate(true);
                envConf.setTransactional(true);
                envConf.setInitializeCache(true);
                envConf.setInitializeLocking(true);
                envConf.setInitializeLogging(true);
                envConf.setCacheSize(64 * 1024 * 1024);
                envConf.setLockDetectMode(LockDetectMode.DEFAULT);

                XmlManagerConfig xmlMgrConfig = new XmlManagerConfig();
                xmlMgrConfig.setAdoptEnvironment(true);

                File dbHome = new File(".");

                try {
                        dbEnv = new Environment(dbHome, envConf);
                        mgr = new XmlManager(dbEnv, xmlMgrConfig);

                        // 创建XmlContainer
                        if(mgr.existsContainer(containerName)!=0)
                                mgr.removeContainer(containerName);

                        XmlContainerConfig containerConf = new XmlContainerConfig();
                        containerConf.setTransactional(true);
                        containerConf.setAllowCreate(true);
                        containerConf.setContainerType(XmlContainer.NodeContainer);
                        cont = mgr.openContainer(containerName, containerConf);
                        cont.setAutoIndexing(false);
                } catch (Exception e) {
                        e.printStackTrace();
                }

        }

        private String name;
        private CountDownLatch doneSignal;

        DbxmlThreads(String name, CountDownLatch doneSignal) {
                this.name = name;
                this.doneSignal = doneSignal;
        }

        public void run() {
                XmlTransaction txn = null;
                try {
                        String content = "<"+name+">I am "+name+"</"+name+">";
                        for (int i = 0; i < 100; i++) {
                                XmlDocumentConfig dc = new XmlDocumentConfig();
                                dc.setGenerateName(true);
                                System.out.println(name+" insert "+i);
                                txn = mgr.createTransaction();

                                XmlDocument doc = mgr.createDocument();
                                doc.setContent(content);
                                cont.putDocument(txn, doc, dc);

                                txn.commit();
                        }
                } catch (XmlException e) {
                        System.out.println("insert error:" + e.getMessage());
                } finally {
                        doneSignal.countDown();
                }
        }

        public static void main(String[] args) throws Exception {

                CountDownLatch doneSignal = new CountDownLatch(5);
                DbxmlThreads threadA = new DbxmlThreads("A", doneSignal);
                DbxmlThreads threadB = new DbxmlThreads("B", doneSignal);
                DbxmlThreads threadC = new DbxmlThreads("C", doneSignal);
                DbxmlThreads threadD = new DbxmlThreads("D", doneSignal);
                DbxmlThreads threadE = new DbxmlThreads("E", doneSignal);

                threadA.start();
                threadB.start();
                threadC.start();
                threadD.start();
                threadE.start();

                doneSignal.await();

                XmlQueryContext qc = mgr.createQueryContext();
                String query = "collection('"+containerName+"')/A";
                XmlResults res = mgr.query(query, qc);
                System.out.println("The results size is: "+res.size());
                res.delete();
                cont.close();
                mgr.close();
        }

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>欢迎加入Berkeley DB群@LinkedIn</title>
		<link>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/</link>
		<comments>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 13:19:01 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=791</guid>
		<description><![CDATA[首先祝各位访客新年快乐，虎年富贵吉祥！
Oracle Berkeley DB在LinkedIn.com上的新建了一个群，供全球的相关人士（包括工程师、产品经理、客户等）共同讨论Berkeley DB的话题和业界动态。群地址：http://www.linkedin.com/groups?gid=2131985. 欢迎加入！
Oracle Berkeley DB 中国研发团队
]]></description>
			<content:encoded><![CDATA[<p>首先祝各位访客新年快乐，虎年富贵吉祥！</p>
<p>Oracle Berkeley DB在LinkedIn.com上的新建了一个群，供全球的相关人士（包括工程师、产品经理、客户等）共同讨论Berkeley DB的话题和业界动态。群地址：<a href="http://www.linkedin.com/groups?gid=2131985">http://www.linkedin.com/groups?gid=2131985</a>. 欢迎加入！</p>
<p>Oracle Berkeley DB 中国研发团队</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB三大产品收费模式</title>
		<link>http://www.bdbchina.com/2009/11/berkeley-db%e4%b8%89%e5%a4%a7%e4%ba%a7%e5%93%81%e6%94%b6%e8%b4%b9%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2009/11/berkeley-db%e4%b8%89%e5%a4%a7%e4%ba%a7%e5%93%81%e6%94%b6%e8%b4%b9%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 08:21:58 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=711</guid>
		<description><![CDATA[众所周知，Berkeley DB是开源的，个人用户可以下载做学习、试用。但实际上，Berkeley DB是Oracle的一个产品，也是要收费的。
英文好的同学，可以读一下我们的授权申明：http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html。
英文不好的同学，我在此可以稍作解释（强调：我的观点仅作参考，Oracle公司拥有最终解释权）：
1.  Berkeley DB产品家族三大产品（BDB，BDB-JE和BDB-XML）都是采取双license的授权模式，即开源（免费使用）和商用（付费使用）两种模式。
2. 衡量两种授权模式的一个主要区别是 &#8211; “redistribute”，意即你是否将自己的应用程序（在你的应用中使用了BDB）发布给第三方，如客户，机构，附属机构，母公司，合作者，中间商，第三方的非营利组织等。
3. 举例子来说：

如果是个人用户做学习研究之用，可以选择开源授权，免费；


如果是个人用户在BDB上做一些应用，如果你的应用是开源发布的，可以选择开源授权（但要符合BSD、GPL等开源条款）；如果是闭源，需要选择商业授权；


如果是在公司的商用项目使用，需要选择商业授权，即付费；

如果大家再有问题，或者不确定，欢迎留言。版权保护，也是保护到每个IT从业人员。
&#8212;
附件： Oracle官方网站给出TimesTen和Berkeley DB 产品家族在美国市场参考价格（见下图）。
关于Oracle产品的价格清单，请浏览官方网址: http://www.oracle.com/corporate/pricing/pricelists.html. 
注意： 价格仅作参考，Oracle公司拥有最终解释权。
]]></description>
			<content:encoded><![CDATA[<p>众所周知，Berkeley DB是开源的，个人用户可以下载做学习、试用。但实际上，Berkeley DB是Oracle的一个产品，也是要收费的。</p>
<p>英文好的同学，可以读一下我们的授权申明：http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html。</p>
<p>英文不好的同学，我在此可以稍作解释（<strong>强调：我的观点仅作参考，Oracle公司拥有最终解释权</strong>）：</p>
<p>1.  Berkeley DB产品家族三大产品（BDB，BDB-JE和BDB-XML）都是采取双license的授权模式，即开源（免费使用）和商用（付费使用）两种模式。</p>
<p>2. 衡量两种授权模式的一个主要区别是 &#8211; “<strong>redistribute</strong>”，意即你是否将自己的应用程序（在你的应用中使用了BDB）发布给第三方，如客户，机构，附属机构，母公司，合作者，中间商，第三方的非营利组织等。</p>
<p>3. 举例子来说：</p>
<ul>
<li>如果是个人用户做学习研究之用，可以选择开源授权，免费；</li>
</ul>
<ul>
<li>如果是个人用户在BDB上做一些应用，如果你的应用是开源发布的，可以选择开源授权（但要符合BSD、GPL等开源条款）；如果是闭源，需要选择商业授权；</li>
</ul>
<ul>
<li>如果是在公司的商用项目使用，需要选择商业授权，即付费；</li>
</ul>
<p>如果大家再有问题，或者不确定，欢迎留言。版权保护，也是保护到每个IT从业人员。</p>
<p>&#8212;</p>
<p><strong><em>附件： Oracle官方网站给出TimesTen和Berkeley DB 产品家族在美国市场参考价格（见下图）。</em></strong></p>
<div id="attachment_779" class="wp-caption aligncenter" style="width: 612px"><a href="http://www.bdbchina.com/wp-content/uploads/2009/11/BDB_price.png"><img class="size-full wp-image-779 " title="BDB Price" src="http://www.bdbchina.com/wp-content/uploads/2009/11/BDB_price.png" alt="Berkeley DB 价格清单" width="602" height="231" /></a><p class="wp-caption-text">Berkeley DB 价格清单</p></div>
<p><em>关于Oracle产品的价格清单，请浏览官方网址: http://www.oracle.com/corporate/pricing/pricelists.html. </em></p>
<p><em>注意： 价格仅作参考，Oracle公司拥有最终解释权。</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/11/berkeley-db%e4%b8%89%e5%a4%a7%e4%ba%a7%e5%93%81%e6%94%b6%e8%b4%b9%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>甲骨文中国(包括Berkeley DB)2010校招日程</title>
		<link>http://www.bdbchina.com/2009/10/%e7%94%b2%e9%aa%a8%e6%96%87%e4%b8%ad%e5%9b%bd%e5%8c%85%e6%8b%acberkeley-dbfy2010%e6%a0%a1%e6%8b%9b%e6%97%a5%e7%a8%8b/</link>
		<comments>http://www.bdbchina.com/2009/10/%e7%94%b2%e9%aa%a8%e6%96%87%e4%b8%ad%e5%9b%bd%e5%8c%85%e6%8b%acberkeley-dbfy2010%e6%a0%a1%e6%8b%9b%e6%97%a5%e7%a8%8b/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 06:37:50 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[Haomian Wang]]></category>
		<category><![CDATA[Linchun Sun]]></category>
		<category><![CDATA[campus]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=692</guid>
		<description><![CDATA[2010财年甲骨文(中国)校园招聘大致流程：
校园宣讲 -&#62; 在线申请 -&#62; 在线测试（涵盖：技术、性格、英文等）-&#62; 初步筛选 -&#62; 邀请合格同学on-site 笔试和面试 -&#62; 进一步筛选 -&#62; 发offer
校园宣讲会初步日程（注意：日期及时间请以51job和校园广告为准）：

Oct. 19th Shanghai Tongji Univ. (19:00-21:00)
Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)
Oct. 21th Guangzhou Southern China Univ. of Tech. (15:00-17:00)
Oct. 26th Beijing Tsinghua Univ. (19:00-21:00)
Oct. 27th Wuhan Huazhong Univ. of Science and Tech. (19:00-21:00)
Oct. 30th Hangzhou Zhejing Univ. (19:00-21:00)
Nov. 2nd Suzhou Suzhou Univ. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>2010财年甲骨文(中国)校园招聘大致流程：</strong><br />
校园宣讲 -&gt; 在线申请 -&gt; 在线测试（涵盖：技术、性格、英文等）-&gt; 初步筛选 -&gt; 邀请合格同学on-site 笔试和面试 -&gt; 进一步筛选 -&gt; 发offer</p>
<p><strong>校园宣讲会初步日程（注意：日期及时间请以51job和校园广告为准）：</strong></p>
<ul>
<li>Oct. 19th Shanghai Tongji Univ. (19:00-21:00)</li>
<li>Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)</li>
<li>Oct. 21th Guangzhou Southern China Univ. of Tech. (15:00-17:00)</li>
<li>Oct. 26th Beijing Tsinghua Univ. (19:00-21:00)</li>
<li>Oct. 27th Wuhan Huazhong Univ. of Science and Tech. (19:00-21:00)</li>
<li>Oct. 30th Hangzhou Zhejing Univ. (19:00-21:00)</li>
<li>Nov. 2nd Suzhou Suzhou Univ. (14:00-16:00)</li>
<li>Nov. 4th Nanjing Southest Univ.(19:00-21:00)</li>
<li>Nov. 5th Dalian Dalian Univ. of Tech. (19:00-21:00)</li>
</ul>
<p><strong><span style="color: red">更新！！原计划于Nov.  6th的在线测试，因后台录入部分同学的纸质简历而推迟。新的时间安排：HR给的反馈是定在本周（Nov. 9th这周末或者周末以前），请大家留意Email通知并谅解。</span></strong></p>
<p><strong><span style="color: red">注: BDB的招聘行程（此项会持续更新，期待届时与你见面交流）</span></strong>：</p>
<ul>
<li>Chao Huang &#8211; 校园宣讲，Oct. 19th Shanghai Tongji Univ. (19:00-21:00)</li>
<li>Eric Wang &#8211; 校园宣讲，Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)</li>
</ul>
<p>今年Oracle会组织在多个城市进行面试，BDB初步决定参加下面4个。各位面试同学的时间地点请以电话通知为准。</p>
<ul>
<li>Eric Wang &#8211; 面试官，Nov. 17-18，深圳</li>
<li>Linchun Sun &#8211; 面试官，Nov. 19-20，广州</li>
<li>Chao Huang &#8211; 面试官，Nov. 25-27，北京</li>
<li>Chao Huang &#8211; 面试官，Nov. 24-25，上海</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/10/%e7%94%b2%e9%aa%a8%e6%96%87%e4%b8%ad%e5%9b%bd%e5%8c%85%e6%8b%acberkeley-dbfy2010%e6%a0%a1%e6%8b%9b%e6%97%a5%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>采用Berkeley DB XML PHP建立原生XML Web服务器</title>
		<link>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
		<comments>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 05:58:39 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=618</guid>
		<description><![CDATA[近十年来，XML应用越发广泛，政府也推出了《基于XML的电子公文格式规范》等标准。那么，在需要XML数据库引擎的情况下，采用原生XML数据库Berkeley DB XML(以下简称BDB XML)取代MySQL(或其它传统DB)做后台数据库是一个更好的选择。
BDB XML是Oracle推出的一款开源原生XML数据库。与传统数据库相比，原生XML数据库的优势有：
1. 可以直接操作XML文件，XML数据无损&#8211;在某些场合，无损的数据源意味着法律效力。
2. 原生检索方式，支持XQuery和XPath，符合XML习惯。
3. 性能优化：原生XML数据库会针对XML特点进行各种优化，如插入文档索引、建立节点ID等。
4. 支持相同数据的不同视图。
和其它原生XML数据库相比，BDB XML优势有：
1. 完整的ACID 事务处理、自动恢复、热备份、用于分布式事务的HA支持。
2. 支持XQuery(含XQuery Update)和XPATH。
3. 可以利用其特有的二进制元数据存取大容量二进制对象(非XML数据)。
4. 支持全Unicode字符集，中文存储、查询都不成问题。
5. 提供一套容器和迭代器接口访问和操作查询结果。
6. 提供交互式命令行工具。

以上第三点是一个非常实用的特性，某种程度上它补足了XML应用的”最后一公里“：比方说，你正在为教育部门开发一个考生管理数据库，需要将考生的资料存成XML文档，那么存取照片(二进制数据)就相当麻烦。一般来讲传统的选择有两种：一是转换为Base64Binary格式嵌入到XML文档中，这意味着存取两端都需要转换大量图片数据，效率就很低下;二是为每个照片生成一个引用再另存它处，只在XML文档中保留一个引用，这种方法不但复杂，而且把数据从文档中分割了出来，损失了ACID特性，管理不便。而使用BDB XML就可以将照片数据直接以二进制元数据的形式嵌入到XML文档中，存取都非常方便，还可以基于数据库实现图像/视频检索。
下面，介绍一下BDB XML PHP的安装过程：
安装Apache+PHP环境
好吧，这是一个烂大街的话题，网上一抓一大把。下面以Debian 5.0和apache2为例：
用aptitude安装以下软件包：

apache2
libapache2-mod-php5
php5
php5-dev
php5-cgi
安装完毕。启动Apache服务器：
sudo /etc/init.d/apache2 start
测试一下是否安装成功，首先找到http的根目录(本机环境是/var/www)，在该目录下生成php测试文件test.php(内容如下)：
&#60;?phpinfo();?&#62;
用浏览器打开网页服务器的test.php，如果安装成功，会打开php信息页。
安装BDB XML PHP
移步http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载源码包dbxml-2.5.13.tar.gz，并放置在$HOME目录下。下面以Linux上的安装为例：

cd $HOME
tar zxf dbxml-2.5.13.tar.gz
cd dbxml-2.5.13
./buildall
cd db-4.8.24/php_db4
phpize
./configure --with-db4=$PWD/../../install
make
sudo make install
cd ../../dbxml/src/php/
phpize
./configure --with-dbxml=$PWD/../../../install
make
sudo make install

接下来编辑/etc/php5/apache2/php.ini和/etc/php5/cgi/php.ini文件(可能路径略有不同)，把以下两行加到Dynamic Extensions段：
extension=db4.so
extension=dbxml.so
大功告成，为保安全，最好重启一下Apache服务器。到此BDB XML PHP全部安装成功。在实际应用中，需要特别注意帐户和权限问题：要保证Apache的运行帐户对容器(Container)文件及其所在目录有读写权限。
范例
从开心网的群共享页面http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=450163&#038;start=0下载附件xmlData.tar.gz，解压后，将xmlData目录下的所有文件拷贝到http根目录下，然后执行：
./gen_cont.sh $HOME/dbxml-2.5.13/install/bin/dbxml
脚本即会生成一个容器：simple.dbxml。该容器内包含三百多个xml文档，形如：
&#60;?xml version="1.0"?&#62;
&#60;产品&#62;
    &#60;种类&#62;fruits&#60;/种类&#62;
    &#60;商品&#62;Avocado&#60;/商品&#62;
    &#60;存货&#62;
 [...]]]></description>
			<content:encoded><![CDATA[<p>近十年来，XML应用越发广泛，政府也推出了《基于XML的电子公文格式规范》等标准。那么，在需要XML数据库引擎的情况下，采用原生XML数据库Berkeley DB XML(以下简称BDB XML)取代MySQL(或其它传统DB)做后台数据库是一个更好的选择。</p>
<p>BDB XML是Oracle推出的一款开源原生XML数据库。与传统数据库相比，原生XML数据库的优势有：<br />
1. 可以直接操作XML文件，XML数据无损&#8211;在某些场合，无损的数据源意味着法律效力。<br />
2. 原生检索方式，支持XQuery和XPath，符合XML习惯。<br />
3. 性能优化：原生XML数据库会针对XML特点进行各种优化，如插入文档索引、建立节点ID等。<br />
4. 支持相同数据的不同视图。</p>
<p>和其它原生XML数据库相比，BDB XML优势有：<br />
1. 完整的ACID 事务处理、自动恢复、热备份、用于分布式事务的HA支持。<br />
2. 支持XQuery(含XQuery Update)和XPATH。<br />
3. 可以利用其特有的二进制元数据存取大容量二进制对象(非XML数据)。<br />
4. 支持全Unicode字符集，中文存储、查询都不成问题。<br />
5. 提供一套容器和迭代器接口访问和操作查询结果。<br />
6. 提供交互式命令行工具。<br />
<span id="more-618"></span><br />
以上第三点是一个非常实用的特性，某种程度上它补足了XML应用的”最后一公里“：比方说，你正在为教育部门开发一个考生管理数据库，需要将考生的资料存成XML文档，那么存取照片(二进制数据)就相当麻烦。一般来讲传统的选择有两种：一是转换为Base64Binary格式嵌入到XML文档中，这意味着存取两端都需要转换大量图片数据，效率就很低下;二是为每个照片生成一个引用再另存它处，只在XML文档中保留一个引用，这种方法不但复杂，而且把数据从文档中分割了出来，损失了ACID特性，管理不便。而使用BDB XML就可以将照片数据直接以二进制元数据的形式嵌入到XML文档中，存取都非常方便，还可以基于数据库实现图像/视频检索。</p>
<p>下面，介绍一下BDB XML PHP的安装过程：</p>
<h2>安装Apache+PHP环境</h2>
<p>好吧，这是一个烂大街的话题，网上一抓一大把。下面以Debian 5.0和apache2为例：<br />
用aptitude安装以下软件包：</p>
<pre>
apache2
libapache2-mod-php5
php5
php5-dev
php5-cgi</pre>
<p>安装完毕。启动Apache服务器：</p>
<pre>sudo /etc/init.d/apache2 start</pre>
<p>测试一下是否安装成功，首先找到http的根目录(本机环境是/var/www)，在该目录下生成php测试文件test.php(内容如下)：</p>
<blockquote><p>&lt;?phpinfo();?&gt;</p></blockquote>
<p>用浏览器打开网页服务器的test.php，如果安装成功，会打开php信息页。</p>
<h2>安装BDB XML PHP</h2>
<p>移步http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载源码包dbxml-2.5.13.tar.gz，并放置在$HOME目录下。下面以Linux上的安装为例：</p>
<pre>
cd $HOME
tar zxf dbxml-2.5.13.tar.gz
cd dbxml-2.5.13
./buildall
cd db-4.8.24/php_db4
phpize
./configure --with-db4=$PWD/../../install
make
sudo make install
cd ../../dbxml/src/php/
phpize
./configure --with-dbxml=$PWD/../../../install
make
sudo make install
</pre>
<p>接下来编辑/etc/php5/apache2/php.ini和/etc/php5/cgi/php.ini文件(可能路径略有不同)，把以下两行加到Dynamic Extensions段：</p>
<pre>extension=db4.so
extension=dbxml.so</pre>
<p>大功告成，为保安全，最好重启一下Apache服务器。到此BDB XML PHP全部安装成功。在实际应用中，需要特别注意帐户和权限问题：<span style="color: #ff0000;"><strong>要保证Apache的运行帐户对容器(Container)文件及其所在目录有读写权限。</strong></span></p>
<h2>范例</h2>
<p>从开心网的群共享页面http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=450163&#038;start=0下载附件xmlData.tar.gz，解压后，将xmlData目录下的所有文件拷贝到http根目录下，然后执行：</p>
<pre>./gen_cont.sh $HOME/dbxml-2.5.13/install/bin/dbxml</pre>
<p>脚本即会生成一个容器：simple.dbxml。该容器内包含三百多个xml文档，形如：</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;产品&gt;
    &lt;种类&gt;fruits&lt;/种类&gt;
    &lt;商品&gt;Avocado&lt;/商品&gt;
    &lt;存货&gt;
        &lt;库存量单位&gt;AvocfruijfHs18&lt;/库存量单位&gt;
        &lt;价格&gt;0.24&lt;/价格&gt;
        &lt;存货&gt;393&lt;/存货&gt;
    &lt;/存货&gt;
    &lt;厂家&gt;Simply Fresh&lt;/厂家&gt;
&lt;/产品&gt;</pre>
<p>使用浏览器访问服务器上的simple.php页面，即可看到转换后输出的数据表。simple.php的内容如下：</p>
<pre>&lt;html&gt;
&lt;body&gt;
&lt;?
$contName = 'simple.dbxml'; // Container名字

// 创建Manager和Context
$mgr = new XmlManager();
$qc = $mgr-&gt;createQueryContext(); // Query Context
$qc-&gt;setDefaultCollection($contName); // 设置默认Container

// 打开Container
$cont = $mgr-&gt;openContainer($contName);

// 创建XQuery查询表达式，将数据提取出来并转换为html表格
$query = 'for $产品 in collection()/产品';
$query .= ' return &lt;tr&gt;';
$query .= '&lt;td&gt;{$产品/种类/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/商品/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/存货/价格/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/存货/存货/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/厂家/string()}&lt;/td&gt;';
$query .= '&lt;/tr&gt;';

// 输出表格头
?&gt;&lt;table width='100%' border='frame'&gt;
&lt;tr&gt;&lt;td&gt;种类&lt;/td&gt;&lt;td&gt;商品&lt;/td&gt;&lt;td&gt;价格&lt;/td&gt;&lt;td&gt;存货&lt;/td&gt;&lt;td&gt;厂家&lt;/td&gt;&lt;/tr&gt;&lt;?

// 查询并遍历结果，输出到表格
$results = $mgr-&gt;query($query, $qc);
while ($results-&gt;hasNext())
echo $results-&gt;next()-&gt;asString();

// 输出表格尾
?&gt;&lt;/table&gt;&lt;?
?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>可见，只需30余行的代码就能完成xml数据库到网页表格的转换。例图：<br />
<img src="http://www.bdbchina.com/wp-content/uploads/2009/10/bdb_xml_php_web.png" alt="bdb_xml_php_web" title="bdb_xml_php_web" width="500" height="500" class="alignnone size-full wp-image-641" /></p>
<h2>总结</h2>
<p>至此，我们已经介绍了BDB XML PHP的安装和使用。至于更多BDB XML功能，如二进制元数据、环境、事务、排序、索引等，请关注后续文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Berkeley DB (中国)2010校园招聘</title>
		<link>http://www.bdbchina.com/2009/09/berkeley-db-%e4%b8%ad%e5%9b%bd%e6%a0%a1%e5%9b%ad%e6%8b%9b%e8%81%98/</link>
		<comments>http://www.bdbchina.com/2009/09/berkeley-db-%e4%b8%ad%e5%9b%bd%e6%a0%a1%e5%9b%ad%e6%8b%9b%e8%81%98/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 06:45:55 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[campus]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=594</guid>
		<description><![CDATA[重要：关于招聘的最新信息，请看：Oracle 2010 校招日程

各位2010届的毕业生同学，你们好！
你喜欢编程，擅长算法吗？你有志于开发数据库内核吗？欢迎你申请加入Berkeley DB全球研发团队。
关于我们及职位要求（见下图）：

Berkeley DB的全球客户（部分）：
重要! 如何申请：
我们将和Oracle其他部门一起，以校园招聘形式来进行。请大家届时留意本博客和Oracle的校园宣传广告、BBS等，然后登录Oracle的在线系统进行申请(网址：http://campus.oracle.cn)。申请时，请选择&#8221;Software Developer&#8221;, 并在系统注明你申请的是Oracle Berkeley DB（也作DB）开发工程师。
今年我们组的招聘名额是4个，地点在深圳。校园宣讲初步定于2009/10月。
]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: red">重要：关于招聘的最新信息，请看</span></strong>：<a title="Oracle 2010校招日程" href="http://www.bdbchina.com/2009/10/%e7%94%b2%e9%aa%a8%e6%96%87%e4%b8%ad%e5%9b%bd%e5%8c%85%e6%8b%acberkeley-dbfy2010%e6%a0%a1%e6%8b%9b%e6%97%a5%e7%a8%8b/" target="_blank">Oracle 2010 校招日程<br />
</a></p>
<p><strong>各位2010届的毕业生同学，你们好！</strong></p>
<p>你喜欢编程，擅长算法吗？你有志于开发数据库内核吗？欢迎你申请加入Berkeley DB全球研发团队。</p>
<p><strong>关于我们及职位要求（见下图）：</strong></p>
<div id="attachment_601" class="wp-caption aligncenter" style="width: 650px"><img class="size-full wp-image-601" title="职位要求" src="http://www.bdbchina.com/wp-content/uploads/2009/09/p1-small.png" alt="职位要求" width="640" height="476" /><p class="wp-caption-text">职位要求</p></div>
<p><span id="more-594"></span></p>
<p><strong>Berkeley DB的全球客户（部分）：</strong></p>
<div id="attachment_602" class="wp-caption aligncenter" style="width: 650px"><img class="size-full wp-image-602" title="商业客户" src="http://www.bdbchina.com/wp-content/uploads/2009/09/p2-small.png" alt="商业客户" width="640" height="484" /><p class="wp-caption-text">商业客户</p></div>
<div id="attachment_603" class="wp-caption aligncenter" style="width: 650px"><img class="size-full wp-image-603" title="开源应用" src="http://www.bdbchina.com/wp-content/uploads/2009/09/p3-small.png" alt="开源应用" width="640" height="480" /><p class="wp-caption-text">开源应用</p></div>
<p><strong>重要! 如何申请：</strong></p>
<p>我们将和Oracle其他部门一起，以校园招聘形式来进行。请大家届时留意本博客和Oracle的校园宣传广告、BBS等，然后登录Oracle的在线系统进行申请(网址：<strong>http://campus.oracle.cn</strong>)。申请时，<strong>请选择&#8221;Software Developer&#8221;</strong>, 并<strong>在系统注明</strong>你申请的是Oracle Berkeley DB（也作DB）开发工程师。</p>
<p>今年我们组的招聘名额是4个，地点在深圳。校园宣讲初步定于2009/10月。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/09/berkeley-db-%e4%b8%ad%e5%9b%bd%e6%a0%a1%e5%9b%ad%e6%8b%9b%e8%81%98/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>小奖品</title>
		<link>http://www.bdbchina.com/2009/09/%e5%b0%8f%e5%a5%96%e5%93%81/</link>
		<comments>http://www.bdbchina.com/2009/09/%e5%b0%8f%e5%a5%96%e5%93%81/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 03:11:56 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=588</guid>
		<description><![CDATA[大家好！
BDB小礼物 &#8211; 若干2GB U盘（带Oracle Logo）
最近留意到我们BDB中国社区算是小有人气了，我们开发人员也十分开心。在此也感谢大家的支持。
我很努力争取到了一些U盘，用来奖励有兴趣为BDB做点事情的朋友。礼物虽不贵重，但希望大家理解，实是我们的一片心意。由于数量有限，先到先得吧。
重在人人参与
BDB的3个产品都是开源的，大家可以下载并研究源代码。有心的开发者，也可以把你自己写的示例程序、文章、使用心得、创意等发给我（chao.huang at oracle dot com）。每个入围的朋友都可以收到我们寄出的小奖品，并且获奖者会在bdbchina blog上公布。
我们鼓励每个人的参与，和大家分享你的才智，共同进步。同时，也期待能出现眼前一亮的创意(idea)，实现自己的事业成功。比如，由于BDB的非关系型数据库的特性，它很适合于用作基因测序等方面数据（基因节点，序列图等）的管理、在医疗监控仪器（大型仪器，小型的传感器等）等应用，等等。
]]></description>
			<content:encoded><![CDATA[<p>大家好！</p>
<p><strong>BDB小礼物 &#8211; 若干2GB U盘</strong>（带Oracle Logo）</p>
<p>最近留意到我们BDB中国社区算是小有人气了，我们开发人员也十分开心。在此也感谢大家的支持。</p>
<p>我很努力争取到了一些U盘，用来奖励有兴趣为BDB做点事情的朋友。礼物虽不贵重，但希望大家理解，实是我们的一片心意。由于数量有限，先到先得吧。</p>
<p><strong>重在人人参与</strong></p>
<p>BDB的3个产品都是开源的，大家可以下载并研究源代码。有心的开发者，也可以把你自己写的示例程序、文章、使用心得、创意等发给我（chao.huang at oracle dot com）。每个入围的朋友都可以收到我们寄出的小奖品，并且获奖者会在bdbchina blog上公布。</p>
<p>我们鼓励每个人的参与，和大家分享你的才智，共同进步。同时，也期待能出现眼前一亮的创意(idea)，实现自己的事业成功。比如，由于BDB的非关系型数据库的特性，它很适合于用作基因测序等方面数据（基因节点，序列图等）的管理、在医疗监控仪器（大型仪器，小型的传感器等）等应用，等等。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/09/%e5%b0%8f%e5%a5%96%e5%93%81/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Xml 2.5 新特性详解一： 概述</title>
		<link>http://www.bdbchina.com/2009/09/berkeley-db-xml-25-%e6%96%b0%e7%89%b9%e6%80%a7%e8%af%a6%e8%a7%a3%e4%b8%80%ef%bc%9a-%e6%a6%82%e8%bf%b0/</link>
		<comments>http://www.bdbchina.com/2009/09/berkeley-db-xml-25-%e6%96%b0%e7%89%b9%e6%80%a7%e8%af%a6%e8%a7%a3%e4%b8%80%ef%bc%9a-%e6%a6%82%e8%bf%b0/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 10:15:30 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Ying Cai]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=554</guid>
		<description><![CDATA[2009年9月14日，Berkeley DB Xml 发布了最新的2.5版本 (包含最新发布的Berkeley DB　4.8版本)，此版本增加了新功能，并对上一个版本的所有bug进行了修复，是一个更快更加稳定的版本，推荐大家升级。下载地址在:http://www.oracle.com/technology/software/products/berkeley-db/index.html。 Berkeley DB Xml 2.5 新特性主要有一下几个方面：
1. 自建索引
2. 在wholeDocument存储模式下的压缩存储
3. Debugging API 和 debug 命令
4. 用户自定义XQuery external 函数
5. XmlResults 增强
6. 更高效的节点存储模式

接下来我们具体了解一下这些新特性：
1. 自建索引
自建索引是Berkeley DB Xml 2.5版的重大改进之一，他的主要功能是自动建立索引无需用户手动添加。在Berkeley DB XMl 2.5中，如果对XmlContainer打开了自建索引功能（通过XmlContainer.setAutoIndexing()方法 或者XmlIndexSpecification.setAutoIndexing()方法），当发现有新的叶子element结点或叶子attribute结点时，XmlContainer会对新的结点增加两个索引。 这两个索引分别是node-*-equality-string 和 node-*-equality-double(*表示结点名字)，在默认情况下自建索引功能是被打开的。
下面我们来看一个列子，看自建索引是如何生效的
ying@bdbcn3:~$ dbxml

dbxml&#62; createcontainer test.dbxml
Creating node storage container

dbxml&#62; putdocument 1.xml "&#60;root&#62;&#60;a att1='test'&#62;test&#60;/a&#62;&#60;b/&#62;&#60;/root&#62;" s
Document added, name = 1.xml

dbxml&#62; listindex
Index: node-element-equality-string node-element-equality-double for node [...]]]></description>
			<content:encoded><![CDATA[<p>2009年9月14日，Berkeley DB Xml 发布了最新的2.5版本 (包含最新发布的Berkeley DB　4.8版本)，此版本增加了新功能，并对上一个版本的所有bug进行了修复，是一个更快更加稳定的版本，推荐大家升级。下载地址在:<a title="http://www.oracle.com/technology/software/products/berkeley-db/index.html" href="http://www.oracle.com/technology/software/products/berkeley-db/index.html" target="_blank">http://www.oracle.com/technology/software/products/berkeley-db/index.html</a>。 Berkeley DB Xml 2.5 新特性主要有一下几个方面：</p>
<p>1. 自建索引<br />
2. 在wholeDocument存储模式下的压缩存储<br />
3. Debugging API 和 debug 命令<br />
4. 用户自定义XQuery external 函数<br />
5. XmlResults 增强<br />
6. 更高效的节点存储模式</p>
<p><span id="more-554"></span></p>
<p>接下来我们具体了解一下这些新特性：</p>
<h3>1. 自建索引</h3>
<p>自建索引是Berkeley DB Xml 2.5版的重大改进之一，他的主要功能是自动建立索引无需用户手动添加。在Berkeley DB XMl 2.5中，如果对XmlContainer打开了自建索引功能（通过XmlContainer.setAutoIndexing()方法 或者XmlIndexSpecification.setAutoIndexing()方法），当发现有新的叶子element结点或叶子attribute结点时，XmlContainer会对新的结点增加两个索引。 这两个索引分别是node-*-equality-string 和 node-*-equality-double(*表示结点名字)，在默认情况下自建索引功能是被打开的。</p>
<p>下面我们来看一个列子，看自建索引是如何生效的</p>
<pre>ying@bdbcn3:~$ dbxml

dbxml&gt; createcontainer test.dbxml
Creating node storage container

dbxml&gt; putdocument 1.xml "&lt;root&gt;&lt;a att1='test'&gt;test&lt;/a&gt;&lt;b/&gt;&lt;/root&gt;" s
Document added, name = 1.xml

dbxml&gt; listindex
Index: node-element-equality-string node-element-equality-double for node {}:a
Index: node-attribute-equality-string node-attribute-equality-double for node {}:att1
Index: node-element-equality-string node-element-equality-double for node {}:b
Index: unique-node-metadata-equality-string for node {http://www.sleepycat.com/2002/dbxml}:name
4 indexes found.</pre>
<h3>2. whole document 模式压缩存储</h3>
<p>在Berkeley DB Xml 2.5中对whole document存储模式添加了压缩储存功能。经过压缩可以提高文档的储存速度和降低存储空间大小。 默认情况下使用unix系统的zlib进行压缩和解压，用户也可以使用自己的压缩和解压缩算法（通过实现XmlCompression接口）。</p>
<p>经过测试，在存储100万个4k大小的文档的XmlContainer,启用压缩的大小为398，516k，不使用压缩的大小为893，500k，可以节省大约55%的空间。</p>
<pre>ying@bdbcn3:~$ du -sk *.dbxml
398516  Compressed.dbxml
893500  Uncompressed.dbxml</pre>
<p>如果用户需要使用自己的压缩算法，可以实现XmlCompression接口， 主要实现compress()方法用于压缩，decompress()方法用于解压缩。 具体例子请参考安装包中example/cxx/misc/compression.cpp或者后续文章。</p>
<h3>3. Debugging API和debug命令</h3>
<p>DB XML shell 增加了一个debug命令， 启动shell后键入debug命令会进入debug模式， 可以用来调试XQuery语句。</p>
<p>例子：</p>
<pre>dbxml&gt; debug "collection('test.dbxml')/root/a"

debug&gt; help

Command Summary
---------------

backtrace     - Prints a stack trace of the currently evaluating query
break         - Sets a break point
breakpoints   - Lists the break points set
continue      - Continues execution of the query
disable       - Disables the break point indentified by the numeric argument
enable        - Enables the break point indentified by the numeric argument
optimizeFocus - Enables or disable focus optimisations
frame         - Changes the current frame
help          - Print help information.  Use 'help commandName' for extended help
lazy          - Enables or disable lazy evaluation optimisations
list          - Prints the query at the current frame
next          - Skips query execution to the end of the current sub-expression
projection    - Enables or disable document projection optimisations
query         - Executes a query in the context of the current frame
queryplan     - Prints the query plan for the expression at the current frame
quit          - Exits the debugger
run           - Runs the query. If the query is already running it will be re-started
step          - Skips query execution forward one sub-expression

debug&gt; run
&lt;a att1="test"&gt;test&lt;/a&gt;

Query completed.</pre>
<p>Debugging API调用是通过实现XmlDebugListener接口，实现此接口的各个方法可以监控XQuery执行的每个过程。Debugging API的使用可以参考example/cxx/misc/debug.cpp或者后续文章。</p>
<h3>4. 用户自定义XQuery externl函数</h3>
<p>新增加的XmlExternalFunction类允许用户使用C++，Java或者Python实现XQuery的external函数( <a href="http://www.xquery.com/tutorials/guided-tour/external-functions-variables.html">什么是XQuery external 函数</a>)。用户只需要继承XmlExternalFunction，并实现execute()方法。 execute()方法中包括了用户需要实现函数的功能。具体例子请参考包含于发布包的example/cxx/misc/extrenalFunction.cpp, 或者这篇文章。</p>
<h3>5. XmlResults增强</h3>
<p>XmlResults类增加了三个方法，用来操作“离线”的XmlResults对象。<br />
a.XmlResults.asEventWriter(), 可以通过这个方法创建一个XmlEventWriter对象。 用这个XmlEventWriter对象可以向XmlResults中写入数据创建自己需要的XmlResults</p>
<p>b.XmlResults.copyResults(), 通过这个方法可以拷贝生成一个持久的XmlResults对象，不会因为container关闭而失效。<br />
c.XmlResults.concatResults()，通过这个方法可以把两个XmlResults对象连接起来形成一个新的XmlResults对象，当然返回的对象也和container的生命周期无关。<br />
具体的使用可以参考后续文章。</p>
<h3>6. Node存储模式增强</h3>
<p>改进了node储存的算法，使得在node储存的模式下XmlContainer的文件大小进一步减小。</p>
<h3>结束语</h3>
<p>Berkeley DB Xml 2.5版是一个更好更快的版本，本系列文章将会对前5个新特性一一通过例子说明，谢谢各位同学关注。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/09/berkeley-db-xml-25-%e6%96%b0%e7%89%b9%e6%80%a7%e8%af%a6%e8%a7%a3%e4%b8%80%ef%bc%9a-%e6%a6%82%e8%bf%b0/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>BDB产品家族在生命科学的应用</title>
		<link>http://www.bdbchina.com/2009/08/bdb%e4%ba%a7%e5%93%81%e5%ae%b6%e6%97%8f%e5%9c%a8%e7%94%9f%e5%91%bd%e7%a7%91%e5%ad%a6%e7%9a%84%e5%ba%94%e7%94%a8/</link>
		<comments>http://www.bdbchina.com/2009/08/bdb%e4%ba%a7%e5%93%81%e5%ae%b6%e6%97%8f%e5%9c%a8%e7%94%9f%e5%91%bd%e7%a7%91%e5%ad%a6%e7%9a%84%e5%ba%94%e7%94%a8/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 07:54:32 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=544</guid>
		<description><![CDATA[大家好，
在今年上半年，我们国家推出了一项7,000亿人民币的医疗改革方案，针对我们IT业界可谓影响很大。近期，我也关注到国内从事生命科学、医疗卫生等方向的一些IT的大动作。我想，在此从嵌入式应用的方向，和大家分享我的一些体会和心得。
- 生命科学中应用
我们的观察：

发现一味新药通常历时8-12年，涉及到庞大的数据量(来自美国辉瑞的反馈：1,000,000种配比; 若干TB的数据量，1 TB约合2,000张CD光盘信息)
新药研究可以是跨多个组织的合作行为，彼此共享数据 – 全球各地的临床研究机构，风险合资公司等
监管机构要求对数据严格管理和控制

数据安全，访问控制，审计，保存，审批，变更，搜索，来自相关规定和标准作业程序的要求


而违规的代价非常高 &#8211; 想象一下三鹿奶粉？


需要经济且可靠的数据管理方式，贯穿于每一个步骤和阶段
需要简单易用的，自适应的软件；倾向于“本地化”数据管理方案
个性化功能实现也需要基于一套高可靠的数据管理软件之上
很多的分析仪器和不同分析技术不间断地产生数据

仪器产生的数据直接写到文件系统，从而容易产生错误和数据丢失


没有标准化的数据格式：每台仪器连着一台独立的计算机


搜索分散于这些独立仪器中的数据几乎是不可能的
越来越多的实验室笔记的电子化



BDB等嵌入式数据库引擎的可能使用场合：

替换文件系统
工作流引擎，及多系统共享数据

非结构化/半结构化的数据
各种不同的格式和需求 – XML, Java, 脚本, 文档, 图像等


脱机工作下的数据缓存(如实验室的电子记录，片剂及其他原始数据)
“物化视图”各种来源的数据 &#8211; Materialized View, 数据缓存
器械本身需要数据管理 - 对比文件系统，具有更高的可靠性
强调软件安全和测试 - Berkeley DB发布版包括完整的测试套件，能够轻松地制定和执行您的测试
可移植性 - Berkeley DB 运行于几乎所有的嵌入式平台
Berkeley DB和其他Oracle技术的无缝集成

举例子来说：

在你医疗分析仪器（光谱，色谱等），可以用BDB来存取数据，保证效率和容错。
在你的医疗影像仪器上和医生的门诊系统上，可以用BDB来缓存你的DICOM数据，和后端的Oracle 11g DICOM数据库集成。
在很多仪器上的配置、管理的信息 &#8211; 通常是XML格式的，可以用到BDB-XML。
在临床、基因科学等研究系统里，可以用BDB-JE 的DPL API来定义基因图片上的Object-Relationship的信息，建立高效的持久化和数据可视化方案。这方面，国外已经有在做了。
等等

- 医疗卫生方面的应用
我们的观察：

各个国家在此方面投入在GDP比重呈快速增长态势：以美国为例，1990年比重为11%，到2005到15%。
老龄化趋势：据估计，中国到2025，超过65岁的人口达1.85亿；比2002年大约要翻一倍
慢性病人群快速增加：肥胖、糖尿病、心脏病等
医疗信息呈现信息化、分散化、个性化趋势：各种信息化的诊断仪器、电子病历、个人守护仪器、个人健康传感器、远程医疗等等

BDB等嵌入式数据库引擎的可能使用场合：

诊断仪器上
个人健康感应仪器 和 与之链接的个人PDA上
医生的诊断系统
远程医疗系统
医疗数据按区域集中（按省、区等）的“云计算”系统中
等等

举例子来说：

对照上面，不用我说了吧？

Web2.0等技术成就了Facebook、Twitter等成功。面对下一个10年，当人们生活质量提高，对医疗卫生的服务也越来越高要求，个性化监控、诊疗和健康数据的de-centralization看来是个不可避免的趋势。你觉得呢？
写了这么多，希望能大家一些启示。欢迎反馈。
]]></description>
			<content:encoded><![CDATA[<p>大家好，</p>
<p>在今年上半年，我们国家推出了一项7,000亿人民币的医疗改革方案，针对我们IT业界可谓影响很大。近期，我也关注到国内从事生命科学、医疗卫生等方向的一些IT的大动作。我想，在此从嵌入式应用的方向，和大家分享我的一些体会和心得。</p>
<h3>- 生命科学中应用</h3>
<p>我们的观察：</p>
<ul>
<li>发现一味新药通常历时8-12年，涉及到庞大的数据量(来自美国辉瑞的反馈：1,000,000种配比; 若干TB的数据量，1 TB约合2,000张CD光盘信息)</li>
<li>新药研究可以是跨多个组织的合作行为，彼此共享数据 – 全球各地的临床研究机构，风险合资公司等</li>
<li>监管机构要求对数据严格管理和控制
<ul>
<li>数据安全，访问控制，审计，保存，审批，变更，搜索，来自相关规定和标准作业程序的要求</li>
</ul>
<ul>
<li>而违规的代价非常高 &#8211; 想象一下三鹿奶粉？</li>
</ul>
</li>
<li>需要经济且可靠的数据管理方式，贯穿于每一个步骤和阶段</li>
<li>需要简单易用的，自适应的软件；倾向于“本地化”数据管理方案</li>
<li>个性化功能实现也需要基于一套高可靠的数据管理软件之上</li>
<li>很多的分析仪器和不同分析技术不间断地产生数据
<ul>
<li>仪器产生的数据直接写到文件系统，从而容易产生错误和数据丢失</li>
</ul>
<ul>
<li>没有标准化的数据格式：每台仪器连着一台独立的计算机</li>
</ul>
</li>
<li>搜索分散于这些独立仪器中的数据几乎是不可能的</li>
<li>越来越多的实验室笔记的电子化</li>
</ul>
<p><span id="more-544"></span></p>
<ul></ul>
<p>BDB等嵌入式数据库引擎的可能使用场合：</p>
<ul>
<li>替换文件系统</li>
<li>工作流引擎，及多系统共享数据
<ul>
<li>非结构化/半结构化的数据</li>
<li>各种不同的格式和需求 – XML, Java, 脚本, 文档, 图像等</li>
</ul>
</li>
<li>脱机工作下的数据缓存(如实验室的电子记录，片剂及其他原始数据)</li>
<li>“物化视图”各种来源的数据 &#8211; Materialized View, 数据缓存</li>
<li>器械本身需要数据管理 - 对比文件系统，具有更高的可靠性</li>
<li>强调软件安全和测试 - Berkeley DB发布版包括完整的测试套件，能够轻松地制定和执行您的测试</li>
<li>可移植性 - Berkeley DB 运行于几乎所有的嵌入式平台</li>
<li>Berkeley DB和其他Oracle技术的无缝集成</li>
</ul>
<p>举例子来说：</p>
<ul>
<li>在你医疗分析仪器（光谱，色谱等），可以用BDB来存取数据，保证效率和容错。</li>
<li>在你的医疗影像仪器上和医生的门诊系统上，可以用BDB来缓存你的DICOM数据，和后端的Oracle 11g DICOM数据库集成。</li>
<li>在很多仪器上的配置、管理的信息 &#8211; 通常是XML格式的，可以用到BDB-XML。</li>
<li>在临床、基因科学等研究系统里，可以用BDB-JE 的DPL API来定义基因图片上的Object-Relationship的信息，建立高效的持久化和数据可视化方案。这方面，国外已经有在做了。</li>
<li>等等</li>
</ul>
<h3>- 医疗卫生方面的应用</h3>
<p>我们的观察：</p>
<ul>
<li>各个国家在此方面投入在GDP比重呈快速增长态势：以美国为例，1990年比重为11%，到2005到15%。</li>
<li>老龄化趋势：据估计，中国到2025，超过65岁的人口达1.85亿；比2002年大约要翻一倍</li>
<li>慢性病人群快速增加：肥胖、糖尿病、心脏病等</li>
<li>医疗信息呈现信息化、分散化、个性化趋势：各种信息化的诊断仪器、电子病历、个人守护仪器、个人健康传感器、远程医疗等等</li>
</ul>
<p>BDB等嵌入式数据库引擎的可能使用场合：</p>
<ul>
<li>诊断仪器上</li>
<li>个人健康感应仪器 和 与之链接的个人PDA上</li>
<li>医生的诊断系统</li>
<li>远程医疗系统</li>
<li>医疗数据按区域集中（按省、区等）的“云计算”系统中</li>
<li>等等</li>
</ul>
<p>举例子来说：</p>
<ul>
<li>对照上面，不用我说了吧？</li>
</ul>
<p>Web2.0等技术成就了Facebook、Twitter等成功。面对下一个10年，当人们生活质量提高，对医疗卫生的服务也越来越高要求，个性化监控、诊疗和健康数据的de-centralization看来是个不可避免的趋势。你觉得呢？</p>
<p>写了这么多，希望能大家一些启示。欢迎反馈。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/08/bdb%e4%ba%a7%e5%93%81%e5%ae%b6%e6%97%8f%e5%9c%a8%e7%94%9f%e5%91%bd%e7%a7%91%e5%ad%a6%e7%9a%84%e5%ba%94%e7%94%a8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Xml 入门系列之三： 使用Berkeley DB Xml Shell</title>
		<link>http://www.bdbchina.com/2009/08/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%89%ef%bc%9a-%e4%bd%bf%e7%94%a8berkeley-db-xml-shell/</link>
		<comments>http://www.bdbchina.com/2009/08/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%89%ef%bc%9a-%e4%bd%bf%e7%94%a8berkeley-db-xml-shell/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 09:39:23 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[赵汝聪]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=511</guid>
		<description><![CDATA[Berkeley DB Xml Shell(以下简称DbXml Shell)是包含在发行包里的工具，可运行于UNIX家族平台(Linux, Solaris, HP-UX, Mac OS, Cygwin, AIX, FreeBSD...)和Windows平台上。DbXml Shell包含Berkeley DB XML的绝大多数常用功能，可以让我们在不编写一行代码的情况下，通过指令快速完成多种复杂操作。]]></description>
			<content:encoded><![CDATA[<h2>1. 简介</h2>
<p>
  <br />Berkeley DB Xml Shell(以下简称DbXml Shell)是包含在发行包里的工具，可运行于UNIX家族平台(Linux, Solaris, HP-UX, Mac OS, Cygwin, AIX, FreeBSD&#8230;)和Windows平台上。DbXml Shell包含Berkeley DB XML的绝大多数常用功能，可以让我们在不编写一行代码的情况下，通过指令快速完成多种常用操作如创建/删除容器、插入/删除文档、查询、验证Query Plan等等，实为居家旅行必备佳品。要是在周五下午遭受紧急任务袭击，就更得靠它来拯救周末了。有时为了解决开发中遇到的问题，只要写一个非常简短的DbXml Shell脚本就可以实现预期功能或是重现环境，极大地提高了劳动生产率。</p>
<p><span id="more-511"></span></p>
<div>
<div id='extendedEntryBreak' name='extendedEntryBreak'></div>
</div>
<p>在使用DbXML shell之前，应当正确编译好Berkeley DB Xml库。具体编译过程请参考博客上的相关文章：<br />
  <br /><a href="http://www.bdbchina.com/2009/07/berkeley-db-xml-complie-on-linux/">Berkeley DB Xml 入门系列之二： 在Linux下编译和使用Berkeley DB Xml</a></p>
<p><a href="http://www.bdbchina.com/2009/04/使用visual-c-2008-express-edition-编译oracle-berkeley-db-xml/">使用Visual C++ 2008 Express Edition 编译Oracle Berkeley DB XML</a></p>
<h2>2. 运行</h2>
<p>
  <br />UNIX下的可执行文件为&lt;dbxml&gt;/install/bin/dbxml，Windows环境下为&lt;dbxml&gt;/bin/dbxml.exe。钻进DbXml Shell以前，先瞄一眼说明(中文是翻译的，发行版是E文的)</p>
<blockquote>
<p>rucong@debian:~/dbxml/install/bin$ ./dbxml –?<br />
    <br />选项: </p>
<p>-c 在-h选项所指定的路径中创建一个新的Berkeley DB环境。 </p>
<p>-h &lt;home&gt; 使用指定的路径作为Berkeley DB环境(默认为当前路径)。 </p>
<p>-P &lt;password&gt; 设置数据库的密码 </p>
<p>-s &lt;script&gt; 执行一个或多个脚本文件 </p>
<p>-t 打开事务功能(transaction mode) </p>
<p>-V 打印版本号 </p>
<p>-v verbose模式，连用两次进入更详细的verbose模式. </p>
<p>-x 安全模式–禁止在XQuery中直接访问本地文件和网络 </p>
<p>-z &lt;size&gt; 设置环境Cache大小为&lt;size&gt;Mb (默认: 64) </p>
<p>-? 本说明</p>
</blockquote>
<h2>3. 指令说明</h2>
<p>
  <br />进入shell: </p>
<blockquote>
<p>rucong@debian:~/dbxml/install/bin$./dbxml</p>
</blockquote>
<p>嗯，已经进入DbXml Shell环境了。还是请help为我们向导一下(嗯&#8230;中文是翻译的，发行版是E文的。排序是按名称的，名词是不译的。列出的是常用的，实际还有更多的)</p>
<table cellspacing="0" cellpadding="2" width="400" border="0">
<tbody>
<tr>
<td valign="top" width="105"># </td>
<td valign="top" width="295">注释符，在脚本中可用#来做注释</td>
</tr>
<tr>
<td valign="top" width="105">abort</td>
<td valign="top" width="295">取消当前事务</td>
</tr>
<tr>
<td valign="top" width="105">addAlias</td>
<td valign="top" width="295">为默认Container增加一个别名</td>
</tr>
<tr>
<td valign="top" width="105">addIndex</td>
<td valign="top" width="295">为默认Container增加一个Index</td>
</tr>
<tr>
<td valign="top" width="105">commit</td>
<td valign="top" width="295">提交当前Transaction，同时自动创建一个新Transaction</td>
</tr>
<tr>
<td valign="top" width="105">compactContainer</td>
<td valign="top" width="295">压缩Container</td>
</tr>
<tr>
<td valign="top" width="105">contextQuery</td>
<td valign="top" width="295">使用上一次查询结果作为上下文，可限定后续查询在已返回的结果中进行</td>
</tr>
<tr>
<td valign="top" width="105">cquery</td>
<td valign="top" width="295">在默认Container中进行查询，本指令和query的不同之处在于省略了显式collection()</td>
</tr>
<tr>
<td valign="top" width="105">createContainer</td>
<td valign="top" width="295">创建一个新的Container，并将其作为默认Container</td>
</tr>
<tr>
<td valign="top" width="105">delIndex</td>
<td valign="top" width="295">在默认Container中删除一条Index</td>
</tr>
<tr>
<td valign="top" width="105">getDocuments</td>
<td valign="top" width="295">获得Container里的所有文档</td>
</tr>
<tr>
<td valign="top" width="105">getMetaData</td>
<td valign="top" width="295">获得指定Document里的metadata</td>
</tr>
<tr>
<td valign="top" width="105">help</td>
<td valign="top" width="295">获得帮助信息。可以对某条指令进行特殊说明，如help putdocument</td>
</tr>
<tr>
<td valign="top" width="105">info</td>
<td valign="top" width="295">获得默认Container的信息</td>
</tr>
<tr>
<td valign="top" width="105">listIndexes</td>
<td valign="top" width="295">列出所有Index</td>
</tr>
<tr>
<td valign="top" width="105">lookupIndex</td>
<td valign="top" width="295">在默认Container中查找Index</td>
</tr>
<tr>
<td valign="top" width="105">lookupStats</td>
<td valign="top" width="295">在默认Container中查看Index状态</td>
</tr>
<tr>
<td valign="top" width="105">openContainer</td>
<td valign="top" width="295">打开一个Container并设置为默认Container</td>
</tr>
<tr>
<td valign="top" width="105">prepare</td>
<td valign="top" width="295">把指定的XQuery表达式预处理为默认Query表达式(default pre-parsed query)，这样就可以快速地重复执行该Query</td>
</tr>
<tr>
<td valign="top" width="105">print</td>
<td valign="top" width="295">输出执行的结果，可输出到文件</td>
</tr>
<tr>
<td valign="top" width="105">putDocument</td>
<td valign="top" width="295">往Container里插入XML文档</td>
</tr>
<tr>
<td valign="top" width="105">query</td>
<td valign="top" width="295">执行指定的XQuery表达式，如无特殊指定，执行的就是prepare指令中预处理好的XQuery表达式</td>
</tr>
<tr>
<td valign="top" width="105">queryPlan</td>
<td valign="top" width="295">输出query plan。用来查看被优化后的表达式执行计划，同时可检查设置的Index是否生效</td>
</tr>
<tr>
<td valign="top" width="105">quit</td>
<td valign="top" width="295">退出程序。如果是用-s执行脚本文件，切记在结尾处加上这一句，不然程序会赖着不退出的</td>
</tr>
<tr>
<td valign="top" width="105">removeAlias</td>
<td valign="top" width="295">删除一个Container的别名</td>
</tr>
<tr>
<td valign="top" width="105">removeContainer</td>
<td valign="top" width="295">删除一个Container</td>
</tr>
<tr>
<td valign="top" width="105">removeDocument</td>
<td valign="top" width="295">在Container中删除一个Document</td>
</tr>
<tr>
<td valign="top" width="105">run</td>
<td valign="top" width="295">执行指定的脚本文件</td>
</tr>
<tr>
<td valign="top" width="105">setBaseUri</td>
<td valign="top" width="295">设置/获取 默认context的base URI</td>
</tr>
<tr>
<td valign="top" width="105">setLazy</td>
<td valign="top" width="295">设置Query为Lazy还是Eager</td>
</tr>
<tr>
<td valign="top" width="105">setMetaData</td>
<td valign="top" width="295">为指定的Document设置一个metadata</td>
</tr>
<tr>
<td valign="top" width="105">setNamespace</td>
<td valign="top" width="295">为默认Context创建一个&quot;prefix-&gt;namespace&quot;绑定</td>
</tr>
<tr>
<td valign="top" width="105">setQueryTimeout</td>
<td valign="top" width="295">设置Query的超时时间</td>
</tr>
<tr>
<td valign="top" width="105">setVerbose</td>
<td valign="top" width="295">设置Verbose级别</td>
</tr>
<tr>
<td valign="top" width="105">time</td>
<td valign="top" width="295">计时。可用来计算指令的执行时间</td>
</tr>
<tr>
<td valign="top" width="105">transaction</td>
<td valign="top" width="295">创建一个事务，用于所有后续操作</td>
</tr>
<tr>
<td valign="top" width="105">upgradeContainer</td>
<td valign="top" width="295">把老版本的XmlContainer升级到现版本</td>
</tr>
</tbody>
</table>
<p>接下来让我们小试牛刀，运行几个常用命令试试：</p>
<p>创建一个空Container</p>
<blockquote>
<p>dbxml&gt; createcontainer &quot;&quot;<br />
    <br />Creating node storage container</p>
</blockquote>
<p>插入一个文档test.xml：</p>
<blockquote>
<p>dbxml&gt; putdocument test.xml &#8216;&lt;root&gt;&lt;a&gt;&lt;b/&gt;&lt;/a&gt;&lt;/root&gt;&#8217;<br />
    <br />Document added, name = test.xml</p>
</blockquote>
<p>看看文档插入了没：</p>
<blockquote>
<p>dbxml&gt; getdocuments<br />
    <br />1 documents found</p>
</blockquote>
<p>检查文档名称：</p>
<blockquote>
<p>dbxml&gt; printname<br />
    <br />test.xml</p>
</blockquote>
<p>检查文档内容：</p>
<blockquote>
<p>dbxml&gt; print<br />
    <br />&lt;root&gt;&lt;a&gt;&lt;b/&gt;&lt;/a&gt;&lt;/root&gt;</p>
</blockquote>
<p>做个简单查询，并计时：</p>
<blockquote>
<p>dbxml&gt; time query collection()/root/a<br />
    <br />1 objects returned for eager expression ‘collection()/root/a’ </p>
<p>Time in seconds for command ‘query’: 0.04848</p>
</blockquote>
<p>输出查询结果：</p>
<blockquote>
<p>dbxml&gt; print<br />
    <br />&lt;a&gt;&lt;b/&gt;&lt;/a&gt;</p>
</blockquote>
<p>退出</p>
<blockquote>
<p>dbxml&gt; print<br />
    <br />&lt;a&gt;&lt;b/&gt;&lt;/a&gt;</p>
</blockquote>
<h2>4.范例</h2>
<p>
  <br />上一节我们在DbXml Shell里做了一些简单的交互式操作，实际上我们采用DbXml Shell脚本更方便。下面是一个简单的DbXml Shell脚本，高级内容参见源代码包里的dbxml/docs/intro_xml/BerkeleyDBXML-Intro.pdf </p>
<blockquote>
<p>createContainer &quot;&quot; #创建一个空Container</p>
<p>#插入一个文档 </p>
<p></p>
<p>putdocument apples.xml &#8216; </p>
<p>&lt;product&gt;<br />
    <br />&lt;category&gt;fruits&lt;/category&gt; </p>
<p>&lt;item&gt;Apples&lt;/item&gt; </p>
<p>&lt;inventory&gt; </p>
<p>&lt;sku&gt;Applfrui1q6lpq&lt;/sku&gt; </p>
<p>&lt;price&gt;1.10&lt;/price&gt; </p>
<p>&lt;inventory&gt;535&lt;/inventory&gt; </p>
<p>&lt;/inventory&gt; </p>
<p>&lt;vendor&gt;Off the Vine&lt;/vendor&gt; </p>
<p>&lt;/product&gt; </p>
<p>&#8216; </p>
<p>getdocuments #获得所有文档 </p>
<p>printnames #输出文档名 </p>
<p>print #输出文档内容 </p>
<p>#使用XQuery查询价格,并计量查询时间<br />
    <br />time query &#8216;collection()/product/inventory/price/string()&#8217; </p>
<p>echo &quot;Price is:&quot; </p>
<p>print </p>
<p>exit #退出</p>
</blockquote>
<p>执行并输出结果： </p>
<blockquote>
<p>rucong@debian:~/dbxml/install/bin$ ./dbxml -s example1.script<br />
    <br />apples.xml</p>
<p>&lt;product&gt;<br />
    <br />&lt;category&gt;fruits&lt;/category&gt; </p>
<p>&lt;item&gt;Apples&lt;/item&gt; </p>
<p>&lt;inventory&gt; </p>
<p>&lt;sku&gt;Applfrui1q6lpq&lt;/sku&gt; </p>
<p>&lt;price&gt;1.10&lt;/price&gt; </p>
<p>&lt;inventory&gt;535&lt;/inventory&gt; </p>
<p>&lt;/inventory&gt; </p>
<p>&lt;vendor&gt;Off the Vine&lt;/vendor&gt; </p>
<p>&lt;/product&gt;</p>
<p>Time in seconds for command ‘query’: 0.008049<br />
    <br />Price is: </p>
<p>1.10</p>
</blockquote>
<h2>5.使用技巧</h2>
<p><strong>rlwrap是个好东西</strong></p>
<p>UNIX用户初用DbXml Shell时，会悲愤地发现bash标配的命令行历史和左右箭头键居然统统废掉。呃&#8230;这意味着键入命令的过程中不能犯错，还不能重复历史指令，极不人道。因此该问题也凭借强大的怨念名列FAQ。其实只要使用rlwrap这个小工具便可以完美地解决这一问题(没有就装一个吧)，rlwrap程序可以添加命令历史和命令编辑功能。用法：rlwrap ./dbxml。这体现了UNIX世界的哲学：把工具们连接在一起，而不是重复实现。</p>
<p>下面这条是OTN上荣列BestPractices的一条经验(作者是Greg Fausak)：</p>
<blockquote>
<p>/usr/bin/rlwrap -m -c -H ~/.rlhistory -l ~/dbxml.log -r -m -P &#8216;openC customer.dbxml \ adda L \ setN &quot;test&quot; &quot;http://mytest.com/&quot;&#8217; /usr/local/bin/dbxml -h ~/sn/db</p>
<p>-H : 把命令执行历史存储在文件.rlhistory<br />
    <br />-l : 把产生的所有的输入和输出存储在文件~/dbxml.log&#8217; </p>
<p>-m : 使能多行命令，和下面的-P选项连用。 -P &quot;&#8230;&quot; 里面的反斜杠\就是分行标识，用来分隔多个命令。 </p>
<p>-P : 在执行操作前，自动输入一批指令。由于DbXml Shell可以执行脚本文件，所以总的说来rlwrap的&quot;-m&quot;和&quot;-P&quot;选项对我们用处不大，可以无视。 </p>
<p>-h 这个是DbXml Shell的参数，指定Berkeley DB环境路径</p>
</blockquote>
<p><strong></strong></p>
<p><strong>创建一个临时Container<br />
    <br /></strong>如果只是做个临时实验，不想大费周章地创建Container文件和DB环境，那么只需要创建一个名字为空的Container就行了。DbXml会在内存中创建一个临时的Container，有需要的话还可以用addAlias为这个空名Container增加别名。</p>
<p>
  <br /><strong>不用输入完整指令<br />
    <br /></strong>Shell会自动补完符合唯一性的指令：比如createc=createContainer，listi=listIndex&#8230;</p>
<p>
  <br /><strong>修改Shell代码<br />
    <br /></strong>Shell不是万能的，如果发现Shell的功能比实际需求就恰巧少了那么一点点，又不想从头编写一套C++/Java程序，那么就Open Source精神来武装头脑指导实践推动工作 &#8212; 杀进DbXml Shell源代码里面修改吧！Shell的源程序在dbxml/src/util/shell目录下，组织得非常规范，只要有初步DbXml编程经验就可以对Shell进行修改和增强。修改之后进入dbxml/build_unix，重新&quot;make; make install&quot;即可。Visual Studio环境下就更方便，重新编译Shell的Project就行了。比如OTN上曾有用户问如何用Shell获得整个Container的MetaData(Shell的getMetaData只能获得一个Document的MetaData)，解决办法就是修改dbxml/src/utils/shell/GetMetaDataCommand.cpp，增加一条循环调用就行了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/08/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%89%ef%bc%9a-%e4%bd%bf%e7%94%a8berkeley-db-xml-shell/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
Դ