8.13. XML 类型

xml数据类型可用于存储 XML 数据。与将 XML 数据存储在text字段中相比,它的优势在于,它会检查 Importing 值的格式是否正确,并且具有用于对其执行类型安全操作的支持功能。参见Section 9.14。使用此数据类型需要使用configure --with-libxml构建安装。

xml类型可以存储 XML 标准定义的格式正确的“文档”,也可以存储“内容”片段,这些片段是通过引用 XQuery 和 XPath 数据模型的更宽松的"document node"来定义的。大致上,这意味着内容片段可以具有多个顶层元素或字符节点。表达式xmlvalue IS DOCUMENT可用于评估特定的xml值是完整文档还是仅是内容片段。

xml数据类型的限制和兼容性说明可在Section D.3中找到。

8 .13.1. 创建 XML 值

要从字符数据生成类型xml的值,请使用函数xmlparse

XMLPARSE ( { DOCUMENT | CONTENT } value)

Examples:

XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

虽然这是根据 SQL 标准将字符串转换为 XML 值的唯一方法,但 PostgreSQL 特定的语法是:

xml '<foo>bar</foo>'
'<foo>bar</foo>'::xml

也可以使用。

即使 Importing 值指定了 DTD,xml类型也不会针对文档类型声明(DTD)验证 Importing 值。当前还没有内置支持针对其他 XML 模式语言(例如 XML 模式)进行验证。

xml生成字符串值的逆运算使用函数xmlserialize

XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )
  • type *可以是charactercharacter varyingtext(或其中之一的别名)。同样,根据 SQL 标准,这是在xml类型和字符类型之间进行转换的唯一方法,但是 PostgreSQL 也允许您简单地转换值。

当将字符串值强制转换为类型xml或从类型xml而不是通过XMLPARSEXMLSERIALIZE强制转换时,DOCUMENTCONTENT的选择由“ XML 选项” 会话配置参数确定,可以使用标准命令来设置:

SET XML OPTION { DOCUMENT | CONTENT };

或更像 PostgreSQL 的语法

SET xmloption TO { DOCUMENT | CONTENT };

默认值为CONTENT,因此允许所有形式的 XML 数据。

8 .13.2. 编码处理

在 Client 端,服务器以及通过它们传递的 XML 数据中处理多种字符编码时,必须格外小心。当使用文本模式将查询传递给服务器并将查询结果传递给 Client 端时(这是正常模式),PostgreSQL 会将在 Client 端和服务器之间传递的所有字符数据转换为相应端的字符编码,反之亦然。参见Section 23.3。这包括 XML 值的字符串表示形式,例如上述示例。通常,这意味着 XML 数据中包含的编码声明可能会无效,因为在 Client 端和服务器之间传输字符数据时,字符数据会转换为其他编码,因为嵌入式编码声明不会更改。为了解决此问题,对于提供给xml类型的 Importing 而呈现的字符串中包含的编码声明被“忽略”了,并且假定内容在当前服务器编码中。因此,为了正确处理,必须以当前 Client 端编码从 Client 端发送 XML 数据的字符串。Client 有责任在将文档发送到服务器之前将文档转换为当前的 Client 编码,或者适当地调整 Client 编码。在输出时,类型xml的值将没有编码声明,并且 Client 端应假定所有数据都在当前 Client 端编码中。

当使用二进制方式将查询参数传递到服务器并将查询结果返回给 Client 端时,不执行编码转换,因此情况有所不同。在这种情况下,将观察到 XML 数据中的编码声明,如果不存在,则假定该数据为 UTF-8(XML 标准要求;请注意 PostgreSQL 不支持 UTF-16)。 。在输出时,数据将具有指定 Client 端编码的编码声明,除非 Client 端编码为 UTF-8,在这种情况下将省略该编码。

不用说,如果 XML 数据编码,Client 端编码和服务器编码相同,那么使用 PostgreSQL 处理 XML 数据将更不会出错,并且效率更高。由于 XML 数据是在 UTF-8 内部处理的,因此如果服务器编码也是 UTF-8,则计算效率最高。

Caution

当服务器编码不是 UTF-8 时,某些与 XML 相关的功能可能对非 ASCII 数据完全不起作用。众所周知,这特别是xmltable()xpath()的问题。

8 .13.3. 访问 XML 值

xml数据类型不常见,因为它不提供任何比较运算符。这是因为没有针对 XML 数据的定义明确且通用的比较算法。这样的结果是,您无法通过将xml列与搜索值进行比较来检索行。因此,XML 值通常应随附一个单独的键字段,例如 ID。比较 XML 值的另一种方法是先将它们转换为字符串,但请注意,字符串比较与有用的 XML 比较方法无关。

由于没有针对xml数据类型的比较运算符,因此无法直接在此类型的列上创建索引。如果需要快速搜索 XML 数据,则可能的解决方法包括将表达式强制转换为字符串类型并为其构建索引,或者为 XPath 表达式构建索引。当然,必须调整实际查询以通过索引表达式进行搜索。

PostgreSQL 中的文本搜索功能还可以用于加速 XML 数据的全文档搜索。但是,PostgreSQL 发行版中尚未提供必需的预处理支持。