Skip to content

XML数据类型

XML简介

XML(Extensible Markup Language)的全称是可扩展标记语言,是一种基于文本的标记语言。XML是W3C(World Wide Web Consortium)的推荐标准,实际上已经成为了Web上数据交换的标准。

XML主要用于Web开发、电子商务、移动应用、配置文件,现在也被用于数据库中。

XML数据可存储在文件、内存和数据库中。

XML在数据库中的实现

XML在虚谷数据库中有XML和XMLTYPE两种类型名,但在底层实现只有XML类型,采用Blob存储,支持最大2GB文本。XML数据类型是数据库自定义基础类型,支持在表、视图中创建XML类型的列;也支持创建XML类型的常量和变量。

XML相关系统函数的详细信息请参见《系统函数参考指南》的XML数据类型函数章节。

XML依赖库

  • xerces-c-3.2.2:对XML作基础处理,更多详细信息请参见Xerces-C网站

  • XQilla-2.3.4:对XML数据进行操作,更多详细信息请参见XQilla网站

XML结构

  • XML声明:XML声明是一个可选的元素,用于指定XML的版本和字符编码。语法如下:

    <?xml version="1.0" encoding="UTF-8"?>
  • 标签:XML使用标签来描述数据的结构。标签由开始标签和结束标签组成,并且可以包含内容。语法如下:

    <tag>content</tag>
  • 属性:XML标签可以具有属性,用于提供有关标签的附加信息。属性由名称和值组成,并且位于开始标签中。语法如下:

    <tag attribute="value">content</tag>
  • 注释:XML可以包含注释,用于提供与数据相关的额外信息。语法如下:

    <!-- This is a comment -->

XML数据格式

XML数据以字符串格式保存,其节点值可以根据特定的格式要求转换为其他数据类型的值。

  • 字符类型
    <string>abc</string>
  • number类型
    <int>11</int>
    <double>11.1</double>
  • bool类型
    <bool>true</bool>
    <bool>false</bool>
  • null
    null

XPath

虚谷支持使用XPath在XML文档中对元素和属性进行遍历,XPath主要用于XML相关的系统函数操作XML数据。

语法规则

  • 元素节点:表示XML或HTML文档中的元素。
    在HTML文档中,<body><div><p>等都是元素节点。在XPath中,可以使用元素名称来选择元素节点,例如://div表示选择所有的<div>元素。

  • 属性节点:表示XML或HTML文档中元素的属性。
    在HTML文档中,元素的classidsrc等属性都是属性节点。在XPath中,可以使用@符号来选择属性节点,例如://img/@src表示选择所有<img>元素的src属性。

  • 文本节点:表示XML或HTML文档中的文本内容。
    在HTML文档中,<p>标签中的文本内容就是文本节点。在XPath中,可以使用text()函数来选择文本节点,例如://p/text()表示选择所有<p>元素中的文本内容。

  • 命名空间节点:表示XML文档中的命名空间,命名空间是一种避免元素命名冲突的方法。
    在XPath中,可以使用namespace轴来选择命名空间节点,例如://namespace::*表示选择所有的命名空间节点。

  • 处理指令节点:表示XML文档中的处理指令,处理指令是一种用来给处理器传递指令的机制。
    在XPath中,可以使用processing-instruction()函数来选择处理指令节点,例如://processing-instruction('xml-stylesheet')表示选择所有的xml-stylesheet处理指令节点。

  • 注释节点:表示XML或HTML文档中的注释,注释是一种用来添加说明和备注的机制。
    在XPath中,可以使用comment()函数来选择注释节点,例如://comment()表示选择所有的注释节点。

  • 文档节点:表示整个XML或HTML文档,文档节点也被称为根节点。
    在XPath中,可以使用/符号来选择文档节点,例如:/表示选择整个文档节点。

示例

xml
<bookstore>
    <book category='fiction'>
        <title>活着</title>
        <author>余华</author>
        <press>作家出版社</press>
        <date>2012-8-1</date>
        <page>191</page>
        <price>20.00</price>
        <staple>平装</staple>
        <series>余华作品(2012版)</series>
        <isbn>9787506365437</isbn>
    </book>
    <book category='non-fiction'>
        <title>撒哈拉的故事</title>
        <author>三毛</author>
        <press>哈尔滨出版社</press>
        <date>2003-8</date>
        <page>217</page>
        <price>15.80</price>
        <staple>平装</staple>
        <series>三毛全集(华文天下2003版)</series>
        <isbn>9787806398791</isbn>
    </book>
    <book category='non-fiction'>
        <title>明朝那些事儿(1-9)</title>
        <author>当年明月</author>
        <press>中国海关出版社</press>
        <date>2009-4</date>
        <page>2682</page>
        <price>358.20</price>
        <staple>精装16开</staple>
        <series>明朝那些事儿(典藏本)</series>
        <isbn>9787801656087</isbn>
    </book>
</bookstore>
表1 XPath使用通配符示例
通配符描述示例
*匹配任何元素节点//book/* 选取<book> 元素下的任意子元素节点
@*匹配任何属性节点//book/@* 选取<book>元素上的任意属性节点,如<book category='fiction'>中的category属性
node()匹配任何类型的节点//book/node() 选取<book>元素下的所有类型的子节点,包括元素节点、文本节点、注释节点等
表2 XPath使用谓词示例
谓词描述示例
[position()=n]选取位于指定位置的节点。n是节点的位置(从1开始计数)//book[position()=1]选取第一个<book>元素
[last()=n]选取位于指定位置的最后一个节点。n是节点的位置(从1开始计数)//book[last()=1]选取最后一个<book>元素
[contains(string, substring)]选取包含指定子字符串的节点。string 是节点的文本内容,substring 是要查找的子字符串//book[contains(title, 'XML')] 选取标题中包含子字符串'XML'的<book>元素
[starts-with(string, prefix)]选取以指定前缀开始的节点。string是节点的文本内容,prefix是要匹配的前缀字符串//book[starts-with(title, 'The')] 选取标题以'The'开始的<book>元素
[text()=string]选取文本内容完全匹配的节点。string 是要匹配的文本内容//book[text()='Book Title'] 选取文本内容为'Book Title'的<book>元素
[@category='non-fiction']选取具有指定属性值的节点。category 是属性名称,non-fiction 是要匹配的值//book[@category='non-fiction'] 选取具有属性category值为'non-fiction'的<book>元素
表3 XPath使用路径表达式示例
表达式描述示例
nodename选取此节点的所有子节点//bookstore/book 选取元素下所有<book>子元素
/从根节点选取直接子节点/bookstore 从根节点选取<bookstore>元素
//从当前节点选取子孙节点//book 选取所有<book>元素,无论它们在文档中的位置
.选取当前节点./title 选取当前节点的<title>子元素
..选取当前节点的父节点../price 选取当前节点的父节点的<price>子元素
@选取属性//book/@id 选取所有<book>元素的id属性

XQuery

XQuery是XML数据的查询语言,类似于SQL是数据库的查询语言,用于查询XML数据。

语法规则

  • XQuery对大小写敏感。
  • XQuery的元素、属性以及变量必须是合法的XML名称。
  • XQuery字符串值可使用单引号或双引号。
  • XQuery变量由 "$" 并跟随一个名称来进行定义,例如:\$bookstore
  • XQuery注释被 (: 和 : ) 分割,例如:(: XQuery 注释 : )

更多XQuery的详细信息请参见XQuery参考资料

XML应用示例

说明:

XML类型必须是符合XML格式的字符串类型。

sql
-- create table
CREATE TABLE t_xml(c_id INT PRIMARY KEY, c_xml XML);

-- insert
INSERT INTO t_xml VALUES(1, '<num>1</num>')(2, '<str>ab</str>');

-- select
SELECT * FROM t_xml;
C_ID|C_XML              |
----+--------------------+
   1|<num>1</num>           |
   2|<str>ab</str>           |

-- update
UPDATE t_xml SET c_xml='<num>2</num>' WHERE c_id = 1;

-- select
SELECT * FROM t_xml;
C_ID|C_XML              |
----+--------------------+
   1|<num>2</num>           |
   2|<str>ab</str>           |

-- delete
DELETE FROM t_xml WHERE c_id = 1;

-- select
SELECT * FROM t_xml;
C_ID|C_XML              |
----+--------------------+
   2|<str>ab</str>           |