IBM最新的数据库,IBM DB2 9,引入了pureXML,一个解决使用XML进行工作的压力的本地XML特性集合。从新的XML数据类型到XQuery语言,DB2 9使得XML开发变得更加容易。
问题,为什么不工作?
目前一切正常。你建立了你的数据库和数据,和获取结果的Web服务。目前你所需要的就是HTML和JavaScript(和CSS)。在你进入到Ajax部分之前,还有一些问题。
检查一下域和域的内容。大多数域,你可以为数据,栏名和数据本身标识一个标记。但是大部分数据不能符合一般的域。传统的,当获取非结构化数据时,你的数据包需要一个catch-all域来放置任何不能清晰解析的数据。对此可能有一些不同的原因:
- 数据从多个非标准源而来,每个数据都有各自的栏名和域类型;
- 你有很多潜在的名称/值 对来包含它们在你的数据结构中,将会需要一个不合理的打表或者非常复杂的数据库结构。
你有处理这些内容的多种方法,每种方法都有问题。比如,你可以:
- 使用HTML格式将数据存储在CLOB中。问题:HTML数据引入了对所需要的自定义工作区比如UI和数据更新的限制。预格式化的数据对其它应用程序变得更加不可用。
- 使用一个不同的标记,比如对你的JavaScript代码更加有用的JSON。问题:数据仍然对其它应用不可用。对于人来说阅读和更新也变得更加困难,在引入其它源的时候需要自定义的转化代码。
- 将数据存储为文本。问题:在显示你的Web应用时去除任何自定义的格式化选项。
在这个特殊的例子中,大多数数据点,比如“POWER”和“WEAKNESS”,有它们自己的栏。这些栏设置有些时候是null。剩下的数据导入到Notes域,排除了其他类型的格式,对其它应用也是没有太大用处。
使用XML数据类型 你可能看到了最优方法是存储非标准数据为一个XML数据。使用DB2 9的XML数据类型,你可以得到如下好处:
- 你可以使用标准的XML格式存储自定义数据
- 你将一个XSD或者DTD文档和XML栏关联以便让每行存储数据在相同的XML结构中,这其实没有必要。每一行可以有一个完全独立的XML文档和结构。
- XML数据对其它应用程序有用
- XML文档能够使用DB2 的XQuery来搜索
- XML文档可以使用一系列的混合语言搜索——XQuery,SQLXML和SQL。同样的,你可以轻松的混合数据类型,同时查询关系型数据和XML数据。如何混合使用XQuery和SQL,请查看http://www.research.ibm.com/journal/sj/452/ozcan.html
如果你回到上文,查看你早先建立的两个范例表,你将会注意到只有三个域的“XML”版本。这是因为最常用的域将会包含在独立的XML文档中。这是引入这些文档和查看数据类型的好机会。
XML域不能被当场编辑,但是可以作为完整的文档增加和更新。可能最简单的方法是通过IMPORT方法,在
http://www.devx.com/ibm/Article/31499文中有详细叙述。为List2-6中的XML数据创建5个独立的XML文件。将这些都保存在一个新目录“C:\PALS”下。
Listing 2: hero1.xml
<HERO> <NOTE title="Power">Can mimic any sound she hears.</NOTE> <NOTE title="Alter ego">Mariah Carey</NOTE> </HERO> Listing 3: hero2.xml <HERO> <NOTE title="Power">Telepathy</NOTE> <NOTE title="Weakness">Gets cranky if he stays up too late.</NOTE> <NOTE title="Current age">8</NOTE> <NOTE title="Additional weakness">Lactose intolerant.</NOTE> </HERO> Listing 4: hero3.xml <HERO> <NOTE title="Power">Super strength; can reattach severed body parts.</NOTE> <NOTE title="Weakness">Not too bright.</NOTE> <NOTE title="Secret Origin">A somewhat clumsy man, Hank "Bullhead" Durham fell into a vat of fresh glue and was promptly struck by lightning. Since then, whenever he loses a part of his body, he has simply to hold it in place and it becomes reattached.</NOTE> </HERO> Listing 5: hero4.xml <HERO> <NOTE title="Power">Glows under a black light.</NOTE> <NOTE title="Weakness">Not having a black light around.</NOTE> <NOTE title="Note">Usually relegated to sidekick, though once played a crucial role in a mission busting an underground pot growers cabal.</NOTE> </HERO> Listing 6: hero5.xml <HERO> <NOTE title="Power">Ability to text message at light speed.</NOTE> <NOTE title="Weakness">Thumbsucking (a nervous habit in times of great stress).</NOTE> <NOTE title="Former Codename">Twiddle</NOTE> </HERO> |
下面将List7 保存在相同的目录下的heroes.del。这个文件的格式非常简单——特别是一个逗号分割的列表,XDS标记指定了它的源文件。在这个例子中,HeroID域被留空了,因为它是自动申城的标识栏,因此你只有其它的域。
Listing 7: heroes.del
Mockingbird,<XDS FIL='hero1.xml' /> Indigo,<XDS FIL='hero2.xml' /> Indivisibull,<XDS FIL='hero3.xml' /> Dayglo,<XDS FIL='hero4.xml' /> Thumbalina,<XDS FIL='hero5.xml' /> |
为了建立你的表,打开命令行编辑器窗口,保证你能够连接AJAXDEMO数据库。将List8拷贝到窗口中执行。
Listing 8: insert.sql
IMPORT FROM 'C:\PALS\heroes.del' OF DEL XML FROM 'C:\PALS' MODIFIED BY IDENTITYMISSING INSERT INTO NULLID.HEROES_XML |
你可以看到消息以“Number of rows committed =5”结尾。如果这样的话,那么你已经成功的引入了HEROES_XML表。为了确认,打开表。在Notes栏,你将看到省略号,如图12所示。

点击其中一个省略号来打开XML文档查看器,将会使用树状视图或者源文件视图显示XML文档。如图13.

注意XML文档的结构已经被故意的选择为最小化当前行的XML节点数目,但是你仍然可以在所需时建立它。这里我决定包含数据名作为节点的“标记”属性,将数据值作为节点值。你可以在下一段中看到JavaScript如何直接操作这一格式。实现这一个解决方案需要一些标准化,你需要从多个数据源中搜集数据。在现在的互联网中,你的源可以通过多种方式标准化。如果你从一个持续格式中引入多个流,比如RSS源,你可以写JavaScript来轻松完成这一个格式。XML数据了型提供了进行这种聚合的最佳资源。