On this page
F.46. xml2
xml2
模块提供 XPath 查询和 XSLT 功能。
F.46.1. 弃用通知
从 PostgreSQL 8.3 开始,核心服务器中具有基于 SQL/XML 标准的 XML 相关功能。该功能涵盖 XML 语法检查和 XPath 查询(这是该模块的工作),以及更多,但 API 根本不兼容。计划在 PostgreSQL 的 Future 版本中删除该模块,以使用较新的标准 API,因此建议您尝试转换应用程序。如果您发现该模块的某些功能无法通过较新的 API 以适当的形式使用,请向<pgsql-hackers@lists.postgresql.org>
解释您的问题,以便可以解决缺陷。
F.46.2. 功能说明
Table F.35显示了此模块提供的功能。这些函数提供了直接的 XML 解析和 XPath 查询。所有参数的类型均为text
,因此为了简洁起见,未显示。
表 F.35.功能
Function | Returns | Description |
---|---|---|
xml_valid(document) |
bool |
这将解析其参数中的文档文本,如果文档是格式正确的 XML,则返回 true。 (注意:这是标准 PostgreSQL 函数xml_is_well_formed() 的别名.由于有效性和格式正确在 XML 中的含义不同,因此名称xml_valid() 在技术上是错误的.) |
xpath_string(document, query) |
text |
这些函数评估提供的文档上的 XPath 查询,并将结果转换为指定的类型。 |
xpath_number(document, query) |
float4 |
|
xpath_bool(document, query) |
bool |
|
xpath_nodeset(document, query, toptag, itemtag) |
text |
这将评估对文档的查询,并将结果包装在 XML 标记中。如果结果是多值的,则输出将如下所示: |
<toptag>
<itemtag>值 1,可能是 XML 片段</itemtag>
<itemtag>Value 2....</itemtag>
</toptag>
如果toptag
或itemtag
是空字符串,则省略相关标签。
| xpath_nodeset(document, query)
| text
|类似于xpath_nodeset(document, query, toptag, itemtag)
,但结果省略了两个标签。
| xpath_nodeset(document, query, itemtag)
| text
|与xpath_nodeset(document, query, toptag, itemtag)
类似,但省略了toptag
。|
| xpath_list(document, query, separator)
| text
|此函数返回由指定的分隔符分隔的多个值,例如,如果分隔符为,
,则返回Value 1,Value 2,Value 3
。
| xpath_list(document, query)
| text
|这是使用,
作为分隔符的上述函数的包装。
F.46.3. xpath_table
xpath_table(text key, text document, text relation, text xpaths, text criteria) returns setof record
xpath_table
是一个表函数,它对一组文档中的每个文档评估一组 XPath 查询,并将结果作为表返回。将原始文档表中的主键字段作为结果的第一列返回,以便可以将结果集轻松用于联接中。参数在Table F.36中描述。
表 F.36.xpath_table
参数
Parameter | Description |
---|---|
key |
“键”字段的名称-这只是要用作输出表第一列的字段,即,它标识了每个输出行来自的记录(请参见下面有关多个值的 Comments) |
document |
包含 XML 文档的字段的名称 |
relation |
包含文档的表或视图的名称 |
xpaths |
一个或多个 XPath 表达式,以| 分隔 |
criteria |
WHERE 子句的内容。这不能省略,因此如果要处理关系中的所有行,请使用true 或1=1 |
这些参数(XPath 字符串除外)仅被替换为普通的 SQL SELECT 语句,因此您具有一定的灵 Active-该语句为
SELECT <key>, <document> FROM <relation> WHERE <criteria>
因此这些参数在那些特定位置可以有效。此 SELECT 的结果需要恰好返回两列(除非您尝试列出键或文档的多个字段,否则它将返回两列)。请注意,这种简单化的方法要求您验证任何用户提供的值,以避免 SQL 注入攻击。
该函数必须在FROM
表达式中使用,并带有AS
子句以指定输出列。例如
SELECT * FROM
xpath_table('article_id',
'article_xml',
'articles',
'/article/author|/article/pages|/article/title',
'date_entered > ''2003-01-01'' ')
AS t(article_id integer, author text, page_count integer, title text);
AS
子句定义输出表中列的名称和类型。第一个是“键”字段,其余对应于 XPath 查询。如果 XPath 查询多于结果列,则多余的查询将被忽略。如果结果列多于 XPath 查询,则多余的列将为 NULL。
请注意,此示例将page_count
结果列定义为整数。该函数在内部处理字符串表示形式,因此当您说要在输出中使用整数时,它将采用 XPath 结果的字符串表示形式,并使用 PostgreSQLImporting 函数将其转换为整数(或AS
子句请求的任何类型) 。如果无法执行此操作将导致错误(例如,如果结果为空),因此,如果您认为数据有任何问题,则可能希望坚持使用text
作为列类型。
调用SELECT
的语句不一定非要是SELECT *
-它可以按名称引用输出列或将它们连接到其他表。该函数会生成一个虚拟表,您可以使用该表执行任何所需的操作(例如,聚合,联接,排序等)。所以我们也可以有:
SELECT t.title, p.fullname, p.email
FROM xpath_table('article_id', 'article_xml', 'articles',
'/article/title|/article/author/@id',
'xpath_string(article_xml,''/article/@date'') > ''2003-03-20'' ')
AS t(article_id integer, title text, author_id integer),
tblPeopleInfo AS p
WHERE t.author_id = p.person_id;
作为一个更复杂的例子。当然,为了方便起见,您可以将所有这些包装在视图中。
F.46.3.1. 多值结果
xpath_table
函数假定每个 XPath 查询的结果都可能是多值的,因此该函数返回的行数可能与 Importing 文档的数不同。返回的第一行包含每个查询的第一个结果,第二行包含每个查询的第二个结果。如果其中一个查询的值比其他查询少,则将返回空值。
在某些情况下,用户将知道给定的 XPath 查询将仅返回单个结果(也许是唯一的文档标识符)-如果与返回多个结果的 XPath 查询一起使用,则单值结果将仅出现在 X 的第一行结果。解决方案是将键字段用作对简单 XPath 查询的联接的一部分。举个例子:
CREATE TABLE test (
id int PRIMARY KEY,
xml text
);
INSERT INTO test VALUES (1, '<doc num="C1">
<line num="L1"><a>1</a><b>2</b><c>3</c></line>
<line num="L2"><a>11</a><b>22</b><c>33</c></line>
</doc>');
INSERT INTO test VALUES (2, '<doc num="C2">
<line num="L1"><a>111</a><b>222</b><c>333</c></line>
<line num="L2"><a>111</a><b>222</b><c>333</c></line>
</doc>');
SELECT * FROM
xpath_table('id','xml','test',
'/doc/@num|/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c',
'true')
AS t(id int, doc_num varchar(10), line_num varchar(10), val1 int, val2 int, val3 int)
WHERE id = 1 ORDER BY doc_num, line_num
id | doc_num | line_num | val1 | val2 | val3
----+---------+----------+------+------+------
1 | C1 | L1 | 1 | 2 | 3
1 | | L2 | 11 | 22 | 33
要在每一行上获取doc_num
,解决方案是使用xpath_table
的两次调用并加入结果:
SELECT t.*,i.doc_num FROM
xpath_table('id', 'xml', 'test',
'/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c',
'true')
AS t(id int, line_num varchar(10), val1 int, val2 int, val3 int),
xpath_table('id', 'xml', 'test', '/doc/@num', 'true')
AS i(id int, doc_num varchar(10))
WHERE i.id=t.id AND i.id=1
ORDER BY doc_num, line_num;
id | line_num | val1 | val2 | val3 | doc_num
----+----------+------+------+------+---------
1 | L1 | 1 | 2 | 3 | C1
1 | L2 | 11 | 22 | 33 | C1
(2 rows)
F.46.4. XSLT 功能
如果安装了 libxslt,则可以使用以下功能:
F.46.4.1. xslt_process
xslt_process(text document, text stylesheet, text paramlist) returns text
此函数将 XSL 样式表应用于文档并返回转换后的结果。 paramlist
是要在转换中使用的参数分配的列表,格式为a=1,b=2
。请注意,参数解析非常简单:参数值不能包含逗号!
还有一个xslt_process
的两参数版本,该参数不将任何参数传递给转换。
F.46.5. Author
约翰·格雷<jgray@azuli.co.uk>
该模块的开发由 Torchbox Ltd.(www.torchbox.com)赞助。它具有与 PostgreSQL 相同的 BSD 许可证。