9.14. XML ����

�����������ĺ����Լ��ຯ���ı���ʽ��������xml��ֵ�ϲ���������xml����ϸ��Ϣ��μ��� 8.13 ����������ֵ������xml֮��ת�����ຯ���ı���ʽxmlparse��xmlserialize�Ͳ��������ظ����ܡ�ʹ�ô󲿷���Щ����Ҫ��װʱʹ����configure --with-libxml���б��롣

9.14.1. ���� XML ����

��һ�麯�����ຯ���ı���ʽ���������� SQL ���ݲ��� XML ���ݡ������ر��ʺ��ڽ���ѯ�����ʽ���� XML �ĵ��Ա����ڿͻ���Ӧ���д�����

9.14.1.1. xmlcomment

xmlcomment(text)

����xmlcomment������һ�� XML ֵ��������һ��ʹ��ָ���ı���Ϊ���ݵ� XML ע�͡����ı�������"--"����Ҳ������һ��"-"��β����������Ľṹ��һ���Ϸ��� XML ע�͡��������Ϊ�գ����ҲΪ�ա�

���ӣ�

SELECT xmlcomment('hello');

  xmlcomment
--------------
 <!--hello-->

9.14.1.2. xmlconcat

xmlconcat(xml[, ...])

����xmlconcat���ɵ��� XML ֵ��ɵ��б����ӳ�һ��������ֵ�����ֵ����һ�� XML ����Ƭ�ϡ���ֵ�ᱻ���ԣ�ֻ�е�û�в���Ϊ�ǿ�ʱ�����Ϊ�ա�

���ӣ�

SELECT xmlconcat('<abc/>', '<bar>foo</bar>');

      xmlconcat
----------------------
 <abc/><bar>foo</bar>

��� XML �������ڣ����ǻᰴ������ķ�ʽ����ϡ�������еIJ���ֵ������ͬ�� XML �汾�������ð汾�������ڽ���У����򽫲�ʹ�ð汾��������в���ֵ�ж�������ֵ"yes"����ô��ֵ�������ڽ���С�������в���ֵ����һ����������ֵ����������һ��Ϊ"no"����"no"�����ڽ���С��������н�û�ж���������������������ҪҪ��һ��������������û�а汾����������ʹ��һ���汾 1.0 �İ汾��������Ϊ XML Ҫ��һ�� XML ����Ҫ����һ���汾���������������ᱻ���Բ�������������ж��ᱻ�Ƴ���

���ӣ�

SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1" standalone="no"?><bar/>');

             xmlconcat
-----------------------------------
 <?xml version="1.1"?><foo/><bar/>

9.14.1.3. xmlelement

xmlelement(name name [, xmlattributes(value [AS attname] [, ... ])] [, content, ...])

����ʽxmlelementʹ�ø������ơ����Ժ����ݲ���һ�� XML Ԫ�ء�

���ӣ�

SELECT xmlelement(name foo);

 xmlelement
------------
 <foo/>

SELECT xmlelement(name foo, xmlattributes('xyz' as bar));

    xmlelement
------------------
 <foo bar="xyz"/>

SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');

             xmlelement
-------------------------------------
 <foo bar="2007-01-26">content</foo>

���ǺϷ� XML ���ֵ�Ԫ�������������������ݣ����ݵķ����ǽ�Υ�����ַ�������_xHHHH_�滻������HHHH�DZ��滻�ַ��� Unicode ������ʮ�����Ʊ�ʾ�����磺

SELECT xmlelement(name "foo$bar", xmlattributes('xyz' as "a&b"));

            xmlelement
----------------------------------
 <foo_x0024_bar a_x0026_b="xyz"/>

�������ֵ��һ�������ã�����Ҫָ��һ����ʽ����������������������е����ֽ���Ĭ���������Ե����֡�����������£����Ա��뱻����һ����ʽ���ơ������������ǺϷ��ģ�

CREATE TABLE test (a xml, b xml);
SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;

����������Щ���Ϸ���

SELECT xmlelement(name test, xmlattributes('constant'), a, b) FROM test;
SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;

���ָ����Ԫ�����ݣ����ǽ����������������͸�ʽ����������ݱ���Ҳ������xml���Ϳ��Թ������ӵ� XML �ĵ������磺

SELECT xmlelement(name foo, xmlattributes('xyz' as bar),
                            xmlelement(name abc),
                            xmlcomment('test'),
                            xmlelement(name xyz));

                  xmlelement
----------------------------------------------
 <foo bar="xyz"><abc/><!--test--><xyz/></foo>

�������͵����ݽ�����ʽ��Ϊ�Ϸ��� XML �ַ����ݡ�����ζ���ַ� <, >, �� & ����ת��Ϊʵ�塣���������ݣ���������bytea��������ʾ�� base64 ��ʮ�����Ʊ��룬����ȡ�������ò���xmlbinary�����á�Ϊ�˽� SQL �� PostgreSQL �������ͺ� XML ģʽ�������룬�����ڴ������������͵��ض���Ϊ�ܹ��Ľ�������ʱ�������һ����Ϊ��ȷ��������

9.14.1.4. xmlforest

xmlforest(content [AS name] [, ...])

����ʽxmlforestʹ�ø������ƺ����ݲ���һ��Ԫ�ص� XML ɭ�֣����У���

���ӣ�

SELECT xmlforest('abc' AS foo, 123 AS bar);

          xmlforest
------------------------------
 <foo>abc</foo><bar>123</bar>


SELECT xmlforest(table_name, column_name)
FROM information_schema.columns
WHERE table_schema = 'pg_catalog';

                                         xmlforest
-------------------------------------------------------------------------------------------
 <table_name>pg_authid</table_name><column_name>rolname</column_name>
 <table_name>pg_authid</table_name><column_name>rolsuper</column_name>
 ...

�������ڵڶ����������������������ֵ��һ�������ã�Ԫ�����ƿ��Ա����ԣ����������Ĭ��ʹ�����������򣬱���ָ��һ�����֡�

������xmlelement��ʾ���Ƿ� XML ���ֵ�Ԫ�����ᱻ���ݡ����Ƶأ���������Ҳ�ᱻ�����������Ϸ��� XML ���ݣ��������Ѿ���һ��xml���͡�

ע����� XML ɭ���ɶ���һ��Ԫ����ɣ���ô�����ǺϷ��� XML �ĵ��������xmlelement�а�װxmlforest����ʽ�����ô���

9.14.1.5. xmlpi

xmlpi(name target [, content])

����ʽxmlpi����һ�� XML ����ָ�����������ݣ����ݲ��ܰ����ַ�����?>��

���ӣ�

SELECT xmlpi(name php, 'echo "hello world";');

            xmlpi
-----------------------------
 <?php echo "hello world";?>

9.14.1.6. xmlroot

xmlroot(xml, version text | no value [, standalone yes|no|no value])

����ʽxmlroot�޸�һ�� XML ֵ�ĸ��������ԡ����ָ����һ���汾�������滻���ڵ�İ汾�����е�ֵ�����ָ����һ���������ã������滻���ڵ�Ķ��������е�ֵ��

SELECT xmlroot(xmlparse(document '<?xml version="1.1"?><content>abc</content>'),
               version '1.0', standalone yes);

                xmlroot
----------------------------------------
 <?xml version="1.0" standalone="yes"?>
 <content>abc</content>

9.14.1.7. xmlagg

xmlagg(xml)

����������������������ͬ������xmlagg��һ���ۼ������������ۼ��������õ�����ֵ�����������dz���xmlconcat���������飬���˴����ǿ��з����Ķ������ڵ�һ�еĶ������ʽ�Ϸ������ۼ�����ʽ�ĸ�����Ϣ����� 9.20 ����

���ӣ�

CREATE TABLE test (y int, x xml);
INSERT INTO test VALUES (1, '<foo>abc</foo>');
INSERT INTO test VALUES (2, '<bar/>');
SELECT xmlagg(x) FROM test;
        xmlagg
----------------------
 <foo>abc</foo><bar/>

Ϊ�˾������ӵ�˳�򣬿���Ϊ�ۼ���������һ��ORDER BY�Ӿ䣬���� 4.2.7 �������������磺

SELECT xmlagg(x ORDER BY y DESC) FROM test;
        xmlagg
----------------------
 <bar/><foo>abc</foo>

�����Ƽ�����ǰ�İ汾��ʹ�����зDZ�׼�����������������ض��������Ȼ���ã�

SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab;
        xmlagg
----------------------
 <bar/><foo>abc</foo>

9.14.2. XML �

��һ�������ı���ʽ���xmlֵ�����ԡ�

9.14.2.1. IS DOCUMENT

xml IS DOCUMENT

������� XML ֵ��һ����ȷ�� XML �ĵ�����IS DOCUMENT�����棬��������򷵻ؼ٣�������һ������Ƭ�ϣ��������Dz���Ϊ��ʱ���ؿա��ĵ�������Ƭ��֮������������ 8.13 ����

9.14.2.2. XMLEXISTS

XMLEXISTS(text PASSING [BY REF] xml [BY REF])

�����һ�������е� XPath ����ʽ�����κν�㣬����xmlexists�����棬���򷵻ؼ٣������һ������Ϊ�գ�������Ϊ�գ���

���ӣ�

SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Toronto</town><town>Ottawa</town></towns>');

 xmlexists
------------
 t
(1 row)

BY REF�Ӿ��� PostgreSQL ��û�����ã�����Ϊ�˺�����ʵ�ֱ��� SQL һ���Ժͼ����Ի������������֡�ÿһ�� SQL ��׼����һ��BY REF�DZ�Ҫ��ģ����ڶ������ǿ�ѡ�ġ�ҲҪע�� SQL ��׼ָ��xmlexists�ṹ����һ�� XQuery ����ʽ��Ϊ��һ���������� PostgreSQL Ŀǰֻ֧�� XPath������ XQuery��һ���Ӽ���

9.14.2.3. xml_is_well_formed

xml_is_well_formed(text)
xml_is_well_formed_document(text)
xml_is_well_formed_content(text)

��Щ�������һ��text���Dz���һ�������� XML������һ�����������xml_is_well_formed_document���һ���������ĵ�����xml_is_well_formed_content������������ݡ����xmloption���ò���������ΪDOCUMENT��xml_is_well_formed������һ�������Ĺ�����������ò���������ΪCONTENT��xml_is_well_formed�����ڶ��������Ĺ���������ζ��xml_is_well_formed���ڼ��һ��������xml�ļ������Ƿ��ɹ��dz����ã������������������ڼ��XMLPARSE�Ķ�Ӧ�����Ƿ��ɹ����á�

���ӣ�

SET xmloption TO DOCUMENT;
SELECT xml_is_well_formed('<>');
 xml_is_well_formed 
--------------------
 f
(1 row)

SELECT xml_is_well_formed('<abc/>');
 xml_is_well_formed 
--------------------
 t
(1 row)

SET xmloption TO CONTENT;
SELECT xml_is_well_formed('abc');
 xml_is_well_formed 
--------------------
 t
(1 row)

SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
 xml_is_well_formed_document 
-----------------------------
 t
(1 row)

SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>');
 xml_is_well_formed_document 
-----------------------------
 f
(1 row)

���һ��������ʾ����Щ���Ҳ�������ֿռ��Ƿ���ȷ��ƥ�䡣

9.14.3. ���� XML

Ҫ������������xml��ֵ�� PostgreSQL �ṩ�˺���xpath��xpath_exists�����Ǽ��� XPath 1.0 ����ʽ��

xpath(xpath, xml [, nsarray])

����xpath�� XML ֵxml�ϼ��� XPath ����ʽxpath (a text value)��������һ�� XML ֵ�����飬�������Ӧ�ڸ� XPath ����ʽ�����Ľ�㼯�ϡ������ XPath ����ʽ����һ������ֵ������һ����㼯�ϣ����᷵��һ����һԪ�ص����顣

�ڶ�������������һ�������� XML �ĵ�������أ���������һ����һ�����Ԫ�ء�

�ú�����ѡ�ĵ�����������һ�����ֿռ�ӳ������顣�������Ӧ����һ����άtext���飬��ڶ��᳤�ȵ���2������Ӧ����һ����������飬����ÿһ�����ɸպ� 2 ��Ԫ����ɣ���ÿ��������ĵ�һ��Ԫ�������ֿռ�����ƣ����������ڶ���Ԫ�������ֿռ�� URI������Ҫ��������������ṩ�ı������� XML �ĵ�������ʹ�õ���Щ���ֿռ���ͬ�����仰˵���� XML �ĵ��к���xpath���������У������������ص�����

���ӣ�

SELECT xpath('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>',
             ARRAY[ARRAY['my', 'http://example.com']]);

 xpath  
--------
 {test}
(1 row)

Ҫ����Ĭ�ϣ������������ռ䣬�����������飺

SELECT xpath('//mydefns:b/text()', '<a xmlns="http://example.com"><b>test</b></a>',
             ARRAY[ARRAY['mydefns', 'http://example.com']]);

 xpath
--------
 {test}
(1 row)

xpath_exists(xpath, xml [, nsarray])

����xpath_exists��xpath������һ��������ʽ������������Ƿ������� XPath �ĵ�һ XML ֵ��������һ������ֵ��ʾ��ѯ�Ƿ����㡣��������ȼ��ڱ�׼��XMLEXISTSν�ʣ����������ṩ�˶�һ�����ֿռ�ӳ�������֧�֡�

���ӣ�

SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>',
                     ARRAY[ARRAY['my', 'http://example.com']]);

 xpath_exists  
--------------
 t
(1 row)

9.14.4. ����ӳ�䵽 XML

����ĺ�������ѹ�ϵ��������ӳ��� XML ֵ�����ǿ��Ա������� XML �������ܣ�

table_to_xml(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xml(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xml(cursor refcursor, count int, nulls boolean,
              tableforest boolean, targetns text)

ÿһ�������ķ���ֵ����xml��

table_to_xmlӳ���ɲ���tbl���ݵ������������ݡ�regclass���ͽ���ʹ�ó�����DZ�ʶ�����ַ�����������ѡ��ģʽ�޶���˫���š�query_to_xmlִ���ɲ���query���ݵIJ�ѯ����ӳ��������cursor_to_xml��cursorָ�����α���ȡ��ָ���������С������Ҫӳ��һ�����͵ı��������Ƽ����ֱ��壬��Ϊÿһ�������������ڴ��й������ֵ�ġ�

���tableforestΪ�٣������� XML �ĵ���������������

<tablename>
  <row>
    <columnname1>data</columnname1>
    <columnname2>data</columnname2>
  </row>

  <row>
    ...
  </row>

  ...
</tablename>

���tableforestΪ�棬�����һ���������������� XML ����Ƭ�ϣ�

<tablename>
  <columnname1>data</columnname1>
  <columnname2>data</columnname2>
</tablename>

<tablename>
  ...
</tablename>

...

���û�б������ã���ӳ��һ����ѯ��һ���α�ʱ���ڵ�һ�ָ�ʽ��ʹ�ô�table���ڵڶ��ָ�ʽ��ʹ��row��

�⼸�ָ�ʽ��ѡ�����û���������һ�ָ�ʽ��һ����ȷ�� XML �ĵ������ںܶ�Ӧ���ж�����Ҫ��������ֵҪ������Ϊһ���ĵ����ڶ��ָ�ʽ��cursor_to_xml�����и����á�ǰ�����۵IJ��� XML ���ݵĺ������ر���xmlelement�����Ա������ѽ���޸ijɷ����û���Ҫ��

����ֵ�ᱻ��ǰ�ĵĺ���xmlelement����������ͬ����ӳ�䡣

����nulls������ֵ�Ƿ�ᱻ����������С����Ϊ�棬���еĿ�ֵ����ʾΪ��

<columnname xsi:nil="true"/>

����xsi�� XML ģʽʵ���� XML ���ֿռ�ǰ׺��һ�����ʵ����ֿռ������������뵽���ֵ�С����Ϊ�٣�������ֵ���н���������к��Ե���

����targetnsָ����Ҫ�Ľ���� XML ���ֿռ䡣���û����Ҫ���ض����ֿռ䣬���ᴫ��һ���մ���

����ĺ������� XML ģʽ�ĵ�����Щ�ĵ�����������Ӧ������ִ�е�ӳ�䣺

table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns text)

����Ҫ������ͬ�IJ��������������ƥ��� XML ����ӳ��� XML ģʽ�ĵ���

����ĺ������� XML ����ӳ��Ͷ�Ӧ�� XML ģʽ�����Ѳ����Ľ��������һ�����һ���ĵ�����ɭ�֣��С���Ҫ���԰������������Ľ�������Ƿdz����ã�

table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)

���⣬����ĺ��������ڲ������Ƶ�����ģʽ��������ǰ���ݿ��ӳ�䣺

schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)

database_to_xml(nulls boolean, tableforest boolean, targetns text)
database_to_xmlschema(nulls boolean, tableforest boolean, targetns text)
database_to_xml_and_xmlschema(nulls boolean, tableforest boolean, targetns text)

ע����Щ�������ܲ����ܶ����ݣ����Ƕ���Ҫ���ڴ��б����������������ģʽ�����ݿ������ӳ��ʱ�����Կ��Ƿֱ�ӳ��ÿһ����������ͨ��һ���α���ӳ�䡣

һ��ģʽ����ӳ��Ľ����������������

<schemaname>

table1-mapping

table2-mapping

...

</schemaname>

����һ����ӳ��ĸ�ʽȡ�������Ľ��͵�tableforest������

һ�����ݿ�����ӳ��Ľ����������������

<dbname>

<schema1name>
  ...
</schema1name>

<schema2name>
  ...
</schema2name>

...

</dbname>

���е�ģʽӳ������������

��Ϊһ��ʹ����Щ������������������ӣ�ͼ 9-1չʾ��һ�� XSLT ��ʽ��������table_to_xml_and_xmlschema�����ת��Ϊһ�����������ݵı�ƽתӡ�� HTML �ĵ�����һ�����Ƶķ�ʽ����Щ�����Ľ�����Ա�ת������������ XML �ĸ�ʽ��

ͼ 9-1. ת�� SQL/XML ����� HTML �� XSLT ��ʽ��

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/1999/xhtml"
>

  <xsl:output method="xml"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
      doctype-public="-//W3C/DTD XHTML 1.0 Strict//EN"
      indent="yes"/>

  <xsl:template match="/*">
    <xsl:variable name="schema" select="//xsd:schema"/>
    <xsl:variable name="tabletypename"
                  select="$schema/xsd:element[@name=name(current())]/@type"/>
    <xsl:variable name="rowtypename"
                  select="$schema/xsd:complexType[@name=$tabletypename]/xsd:sequence/xsd:element[@name='row']/@type"/>

    <html>
      <head>
        <title><xsl:value-of select="name(current())"/></title>
      </head>
      <body>
        <table>
          <tr>
            <xsl:for-each select="$schema/xsd:complexType[@name=$rowtypename]/xsd:sequence/xsd:element/@name">
              <th><xsl:value-of select="."/></th>
            </xsl:for-each>
          </tr>

          <xsl:for-each select="row">
            <tr>
              <xsl:for-each select="*">
                <td><xsl:value-of select="."/></td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>