下图说明了该过程。
请注意,要理解 OPENXML,需要熟悉 XPath 查询并理解 XML。有关 SQL Server 中 XPath 支持的详细信息,请参阅Using XPath Queries in SQLXML 4.0。
OPENXML 允许将行和列的 XPath 模式参数化为变量。如果程序员向外部用户公开参数化(例如通过外部调用的存储过程提供参数),这种参数化可能会导致引入 XPath 表达式。为了避免这种潜在的安全问题,建议切勿向外部调用方公开 XPath 参数。
OPENXML 的参数包括:
XML 文档句柄 (idoc)
标识要映射到行的节点的 XPath 表达式 (rowpattern)
对要生成的行集的说明
行集列和 XML 节点之间的映射
XML 文档句柄 (idoc)
sp_xml_preparedocument 存储过程返回该文档句柄。
标识要处理的节点的 XPath 表达式 (rowpattern)
指定为 rowpattern 的 XPath 表达式标识 XML 文档中的一组节点。rowpattern 标识的每个节点对应于 OPENXML 所生成的行集中的一行。
XPath 表达式标识的节点可以是 XML 文档中的任何 XML 节点。如果 rowpattern 标识 XML 文档中的一组元素,则所标识的每个元素节点在行集中都占一行。例如,如果 rowpattern 以属性结束,则将为 rowpattern 选择的每个属性节点创建一行。
对要生成的行集的说明
OPENXML 使用行集架构来生成结果行集。指定行集架构时,可以使用下列选项。
使用边缘表格式
应使用边缘表格式来指定行集架构。请勿使用 WITH 子句。
否则,OPENXML 将以边缘表格式返回行集。边缘表这种称谓源于已分析的 XML 文档树中的每个边缘都映射到行集中的一行。
边缘表在单个表中表示 XML 文档的细密结构。此结构包括元素名称和属性名称、文档层次结构、命名空间和处理指令。通过边缘表格式可以获得无法通过元属性表现的其他信息。有关元属性的详细信息,请参阅“在 OPENXML 中指定元属性”(29bfd1c6-3f9a-43c4-924a-53d438e442f4)。
通过边缘表提供的其他信息可以存储和查询元素和属性的数据类型以及节点类型,另外还可以存储和查询有关 XML 文档结构的信息。有了这些其他信息,还可以创建您自己的 XML 文档管理系统。
通过使用边缘表,可以编写这样一些存储过程:将 XML 文档作为二进制大型对象 (BLOB) 输入,生成边缘表,然后以更为详细的级别提取和分析文档。此详细级别可以包括查找文档层次结构、元素名称和属性名称、命名空间和处理指令。
当映射到其他关系格式不合逻辑且 ntext 字段没有提供足够的结构信息时,边缘表还可以用作 XML 文档的存储格式。
在可以使用 XML 分析器检查 XML 文档的情况下,使用边缘表也可以获得相同的信息。
下表介绍了边缘表的结构。
列名 | 数据类型 | 说明 |
---|---|---|
id |
bigint |
是文档节点的唯一 ID。 根元素的 ID 值为 0。保留负 ID 值。 |
parentid |
bigint |
标识节点的父节点。此 ID 标识的父节点不一定是父元素。具体情况取决于此 ID 所标识节点的子节点的节点类型。例如,如果节点为文本节点,则其父节点可能是一个属性节点。 如果节点位于 XML 文档的顶层,则其 ParentID 为 NULL。 |
节点类型 |
int |
标识节点类型,是对应于 XML 对象模型 (DOM) 节点类型编号的一个整数。 下列值是可以显示在此列中以指明节点类型的值: 1 = 元素节点 2 = 属性节点 3 = 文本节点 4 = CDATA 部分节点 5 = 实体引用节点 6 = 实体节点 7 = 处理指令节点 8 = 注释节点 9 = 文档节点 10 = 文档类型节点 11 = 文档片段节点 12 = 表示法节点 有关详细信息,请参阅 Microsoft XML (MSXML) SDK 中的“节点类型属性”主题。 |
localname |
nvarchar(max) |
提供元素或属性的本地名称。如果 DOM 对象没有名称则为 NULL。 |
prefix |
nvarchar(max) |
是节点名称的命名空间前缀。 |
namespaceuri |
nvarchar(max) |
是节点的命名空间 URI。如果值是 NULL,则命名空间不存在。 |
datatype |
nvarchar(max) |
是元素或属性行的实际数据类型,否则是 NULL。数据类型是从内联 DTD 中或从内联架构中推断得出。 |
prev |
bigint |
是前一个同级元素的 XML ID。如果前面没有同级元素则为 NULL。 |
text |
ntext |
包含文本形式的属性值或元素内容。如果边缘表项不需要值则为 NULL。 |