XMLPARSE 标量函数
XMLPARSE 函数将参数解析为 XML 文档并返回 XML 值。
该模式是 SYSIBM。 不能将函数名指定为限定名。
- DOCUMENT
- 指定要解析的字符串表达式必须求值为符合 XML 1.0的格式正确的 XML 文档,如 XML 名称空间建议所修改 (SQLSTATE 2200M)。
- string-expression
- 指定返回字符串或 BLOB 值的表达式。 如果使用参数标记,那么必须将其显式强制类型转换为其中一种受支持的数据类型。
- STRIP WHITESPACE 或 PRESERVE WHITESPACE
- 指定是否保留输入参数中的空格。 如果两者都未指定,那么缺省值为 STRIP WHITESPACE。
- 条带空格
- 指定将除去仅包含长度不超过 1000 字节的空格字符的文本节点,除非最近包含的元素具有属性 xml:space = 'preserve'。 如果任何文本节点以超过 1000 字节的空格开头,那么将返回错误 (SQLSTATE 54059)。
CDATA 部分中的空格字符也受此选项影响。 DTD 可能具有元素的 DOCTYPE 声明,但元素的内容模型不用于确定是否除去空格。
- 保留空格
- 指定将保留所有空格,即使最近包含的元素具有属性 xml:space = 'default' 也是如此。
结果的数据类型为 XML。 如果 string-expression 的结果可为空,那么结果可为空;如果 string-expression 的结果为空,那么结果为空。
注意
- 输入字符串的编码: 输入字符串可能包含用于标识 XML 文档中字符的编码的 XML 声明。 如果将该字符串作为字符串传递到 XMLPARSE 函数,那么它将转换为数据库服务器上的代码页。 此代码页可能与原始代码页和 XML 声明中标识的编码不同。
因此,应用程序应避免将 XMLPARSE 与字符串输入直接配合使用,并应直接使用主变量发送包含 XML 文档的字符串,以保持外部代码页与 XML 声明中的编码之间的匹配。 如果必须在此情况下使用 XMLPARSE ,那么应将 BLOB 类型指定为参数以避免代码页转换。
- 处理 DTD: 必须在数据库中注册外部文档类型定义 (DTD) 和实体。 将检查内部和外部 DTD 以获取有效语法。 在解析过程中,还会执行以下操作:
- 将应用内部和外部 DTD 定义的缺省值。
- 实体引用和参数实体将替换为其展开的表单。
- 如果内部 DTD 和外部 DTD 定义了同一元素,那么将返回错误 (SQLSTATE 2200M)。
- 如果内部 DTD 和外部 DTD 定义了相同的实体或属性,那么将选择内部定义。
- non-UTF-8 数据库中的字符转换: 如果从字符数据类型的主变量或参数标记传入 XML 文档,或者从字符串字面值传入该文档,那么当 XML 文档解析为非 Unicode 数据库服务器时,将发生代码页转换。 使用类型为 XML , BLOB 或 FOR BIT DATA (CHAR FOR BIT DATA 或 VARCHAR FOR BIT DATA) 的主变量或参数标记来解析 XML 文档会阻止代码页转换。 使用字符数据类型时,必须注意确保 XML 文档中的所有字符在目标数据库代码页中都具有匹配的代码点,否则可能会引入替换字符。 配置参数 enable_xmlchar 可用于帮助确保存储在非 Unicode 数据库中的 XML 数据的完整性。 将此参数设置为 "NO" 会阻止从字符数据类型插入 XML 文档。 仍允许 BLOB 和 FOR BIT DATA 数据类型,因为使用这些数据类型传递到数据库中的文档会避免代码页转换。
示例
使用 PRESERVE WHITESPACE 选项可保留插入到表中的 XML 文档中的空格字符,包括描述元素中的空格字符。
INSERT INTO PRODUCT VALUES ('100-103-99','Tool bag',14.95,NULL,NULL,NULL,
XMLPARSE( DOCUMENT
'<product xmlns="http://posample.org" pid="100-103-99">
<description>
<name>Tool bag</name>
<details>
Super Deluxe tool bag:
- 26 inches long, 12 inches wide
- Curved padded handle
- Locking latch
- Reinforced exterior pockets
</details>
<price>14.95</price>
<weight>3 kg</weight>
</description>
</product>' PRESERVE WHITESPACE ));运行以下 SELECT 语句
SELECT XMLQUERY ('$d/*:product/*:description/*:details' PASSING DESCRIPTION as "d" )
FROM PRODUCT WHERE PID = '100-103-99' ;返回带有空格字符的 details 元素:<details xmlns="http://posample.org">
Super Deluxe tool bag:
- 26 inches long, 12 inches wide
- Curved padded handle
- Locking latch
- Reinforced exterior pockets
</details>