DB2 pureXML允许将格式正确的XML文档以本机格式存储在关系数据库中。 通过使用SQL和XQUERY语言,可以在数据库中操作这些文档。 如果没有此功能,应用程序将必须接收完整的文档,进行更改,然后将完整的文档返回数据库。 对于大文件或大量文件,这可能会使网络连接快速饱和。
pureXML功能包括对SQL函数XMLQUERY,XMLTABLE和XMLEXISTS的支持。 这些分别在SELECT,FROM和WHERE子句中使用。 XMLTABLE函数允许多个XPath或XQuery表达式指定文档中的元素,然后像在关系表中一样对其进行访问。 XMLTABLE函数中的一个XQuery表达式用作生成行的表达式,这意味着XMLTABLE函数针对此XQuery表达式返回的每一项返回一行。 使用多个XMLTABLE函数调用可以模拟基于SQL的工具可用的外键关系。 有关XMLTABLE函数的更多详细信息,您可以阅读developerWorks文章XMLTABLE示例 。
有时将XML转换为关系数据称为“切碎”。 使用DB2 pureXML可以切碎文档而无需从数据库中检索它,并将结果存储在关系表中。
留言内容
ASDI消息
为了探索XML文档的分解或“分解”,将使用“向工业界展示飞机状况(ASDI)”作为其架构。 ASDI是一个定义明确的标准,它使用XML通过数据馈送向航空业成员传播有关空中交通数据的信息。 该信息以包含多个消息的流的形式到达, 如图1所示。 共有11条常见消息,它们由81个核心元素组成。
arrivalInformation消息
ASDI提要中的一种消息是到达消息。 它具有一种到达信息( 图2 )。 此复杂类型定义为qualifiedAircraftIdType类型( 图3 )和timeOfArrivalType类型的两个元素。 QualifiedAircraftIdType由computerIdType( 图4 ),出发位置信息和到达位置信息组成。
图1.典型消息流的框图
图2. ArrivalInformationType模式
图3.qualifiedAircraftIdType模式
图4. computerIdType模式
分解文件
场景:分析人员希望运行一些查询以汇总到达信息。 仅需要一部分可用数据。 该数据将汇总为报告。 这是一个一次性的过程,将仅偶尔运行且优先级较低。
定义重要的数据元素
应用程序不需要了解文档架构中的所有元素。 第一步应该是编译重要元素和XPATH表达式的列表,以在XML文档中找到它们。 下一步考虑聚合或过滤可能需要的其他元素。
一旦定义了重要元素,就可以从XML模式,样本文档和提供的转换中确定它们的关系数据类型。 然后可以将紧密相关的元素分组为表和相关表,类似于用于传统关系数据库建模的方法。 拥有一个如表1所示的清单很有用,该清单使用源元素的XPATH表达式跟踪关系表,列和数据类型。 如果需要进行转换以更改返回数据的方式,则也可以在清单中注明。
在ASDI模式中,computerId具有三个元素,它们是字符串,可以在关系数据库中表示为单个表。
表1.该表显示了从关系列到XPATH表达式的computerId映射
表 | 柱 | 数据类型 | XPATH |
---|---|---|---|
计算机ID | facilityId | VARCHAR(4) | / adiMessage / arrivalInformation / nxcm:qualifiedAircraftId / nxce:computerId / nxce:facilityIdentifier |
计算机ID | computerSystemId | VARCHAR(5) | / asdiMessage / arrivalInformation / nxcm:qualifiedAircraftId / nxce:computerId / nxce:computerSystemId |
计算机ID | 身份证号码 | VARCHAR(3) | / asdiMessage / arrivalInformation / nxcm:qualifiedAircraftId / nxce:computerId / nxce:idNumber |
清单1. ComputerId表
CREATE TABLE computerid (
facilityID VARCHAR(4),
computersystemID VARCHAR(5),
idnumber VARCHAR(3)
)
清单2.填充ComputerId表的XMLTable查询
INSERT INTO computerid (facilityID, computersystemID, idnumber)
SELECT X.facilityID, X.computersystemID, x.idnumber
FROM XMLTABLE (
XMLNAMESPACES( 'http://tfm.faa.gov/tfms/NasXCoreElements' AS "nxce",
'http://tfm.faa.gov/tfms/MessageMetaData' AS "mmd",
'http://tfm.faa.gov/tfms/NasXCommonMes