XMLPARSE 标量函数

XMLPARSE 函数将参数解析为 XML 文档并返回 XML 值。

Read syntax diagramSkip visual syntax diagramXMLPARSE(DOCUMENTstring-expression STRIP WHITESPACEPRESERVE WHITESPACE )

该模式是 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 定义了相同的实体或属性,那么将选择内部定义。
    解析后,内部 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>