XML数据类型
📄字数 3.3K
👁️阅读量 加载中...
XML(Extensible Markup Language)的全称是可扩展标记语言,是一种基于文本的标记语言。XML 是 W3C(World Wide Web Consortium)的推荐标准,实际上已经成为了Web上数据交换的标准。
XML 主要用于 Web 开发、电子商务、移动应用、配置文件,现在也被用于数据库中。
XML 数据可存储在文件、内存和数据库中。
一、XML简介
1.1 XML在数据库中的实现
XuguDB 支持 XML和 XMLTYPE 两种类型,底层实现为 XML,采用 BLOB 存储,支持最大 2GB 文本。XML 数据类型是数据库自定义基础类型,支持在表、视图中创建 XML 类型的列;也支持创建 XML 类型的常量和变量。
XML 相关系统函数的详细信息请参见《系统函数》的XML函数
章节。
1.2 XML依赖库
XuguDB 将 XML 依赖以静态库的方式编译到数据库中,无需手动处理依赖。依赖的详细信息如下:
xerces-c-3.2.2:对XML作基础处理,详细信息请参见Xerces-C网站。
XQilla-2.3.4:对XML数据进行操作,详细信息请参见XQilla网站。
1.3 XML结构
- XML 声明:XML 声明是一个可选的元素,用于指定 XML 的版本和字符编码。语法如下:
xml
<?xml version="1.0" encoding="UTF-8"?>
- 标签:XML 使用标签来描述数据的结构。标签由开始标签和结束标签组成,并且可以包含内容。语法如下:
xml
<tag>content</tag>
- 属性:XML 标签可以具有属性,用于提供有关标签的附加信息。属性由名称和值组成,并且位于开始标签中。语法如下:
xml
<tag attribute="value">content</tag>
- 注释:XML 可以包含注释,用于提供与数据相关的额外信息。语法如下:
xml
<!-- This is a comment -->
1.4 XML数据格式
XML 数据以字符串格式保存,其节点值可以根据特定的格式要求转换为其他数据类型的值。
- 字符类型
xml
<string>abc</string>
- number类型
xml
<int>11</int>
<double>11.1</double>
- bool类型
xml
<bool>true</bool>
<bool>false</bool>
- null
xml
null
二、XPath
虚谷支持使用 XPath 在 XML 文档中对元素和属性进行遍历,XPath 主要用于在 XML中,并通过相关的系统函数来操作和查询数据。
2.1 语法规则
节点类型 | 节点介绍 | 示例 | xpath匹配方式 |
---|---|---|---|
元素节点 | 表示XML或HTML文档中的元素 | 在HTML文档中,<body> 、<div> 、<p> 等都是元素节点 | 在XPath中,可以使用元素名称来选择元素节点,例如://div 表示选择所有的<div> 元素 |
属性节点 | 表示XML或HTML文档中元素的属性 | 在HTML文档中,元素的class 、id 、src 等属性都是属性节点 | 在XPath中,可以使用@符号来选择属性节点,例如://img/@src 表示选择所有<img> 元素的src 属性 |
文本节点 | 表示XML或HTML文档中的文本内容 | 在HTML文档中,<p> 标签中的文本内容就是文本节点 | 在XPath中,可以使用text()函数来选择文本节点,例如://p/text() 表示选择所有<p> 元素中的文本内容 |
命名空间节点 | 表示XML文档中的命名空间,命名空间是一种避免元素命名冲突的方法 | 在HTML文档中,<namespace> 标签就是命名空间节点 | 在XPath中,可以使用namespace轴来选择命名空间节点,例如://namespace::* 表示选择所有的命名空间节点 |
处理指令节点 | 表示XML文档中的处理指令,处理指令是一种用来给处理器传递指令的机制 | <?target-app instruction?> | 在XPath中,可以使用processing-instruction()函数来选择处理指令节点,例如://processing-instruction('xml-stylesheet') 表示选择所有的xml-stylesheet处理指令节点 |
注释节点 | 表示XML或HTML文档中的注释,注释是一种用来添加说明和备注的机制 | 在HTML文档中,<comment> 标签中的文本内容就是注释节点 | 在XPath中,可以使用comment()函数来选择注释节点,例如://comment() 表示选择所有的注释节点 |
文档节点 | 表示整个XML或HTML文档,文档节点也被称为根节点 | 例如<html> 标签 | 在XPath中,可以使用/符号来选择文档节点,例如:/ 表示选择整个文档节点 |
2.2 示例
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>
通配符 | 描述 | 示例 |
---|---|---|
* | 匹配任何元素节点 | /book/* 选取<book>元素下的任意子元素节点 |
@* | 匹配任何属性节点 | //book/@* 选取<book>元素上的任意属性节点,如<book category='fiction'>中的category属性 |
node() | 匹配任何类型的节点 | //book/node() 选取<book>元素下的所有类型的子节点,包括元素节点、文本节点、注释节点等 |
谓词 | 描述 | 示例 |
---|---|---|
[position()=n] | 选取位于指定位置的节点。n是节点的位置(从1开始计数) | //book[contains(title, 'XML')] 选取标题中包含子字符串'XML'的<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>元素 |
表达式 | 描述 | 示例 |
---|---|---|
nodename | 从根节点选取直接子节点 | //bookstore/book 选取元素下所有<book>子元素 |
/ | 从根节点选取直接子节点 | /bookstore 从根节点选取<bookstore>元素 |
// | 从当前节点选取子孙节点 | //book 选取所有<book>元素,无论它们在文档中的位置 |
. | 选取当前节点 | ./title 选取当前节点的<title>子元素 |
.. | 选取当前节点的父节点 | ../price 选取当前节点的父节点的<price>子元素 |
@ | 选取属性 | //book/@id 选取所有<book>元素的id属性 |
三、XQuery
XQuery 是一种用于查询XML数据的查询语言,类似于 SQL 用于查询关系数据库。允许用户从 XML 文档中提取数据。
3.1 语法规则
- XQuery 对大小写敏感。
- XQuery 的元素、属性以及变量必须是合法的XML名称。
- XQuery 字符串值可使用单引号或双引号。
- XQuery 变量由 "$" 并跟随一个名称来进行定义,例如:
\$bookstore
。 - XQuery 注释被 (: 和 : ) 分割,例如:
(: XQuery 注释 : )
。
更多XQuery的详细信息请参见XQuery参考资料。
四、XML应用示例
注意
XML 类型必须是符合 XML 格式的字符串类型。
sql
-- create table
SQL> CREATE TABLE t_xml(c_id INT PRIMARY KEY, c_xml XML);
-- insert
SQL> INSERT INTO t_xml VALUES(1, '<num>1</num>')(2, '<str>ab</str>');
-- select
SQL> SELECT * FROM t_xml;
+------+---------------+
| C_ID | C_XML |
+------+---------------+
| 1 | <num>1</num> |
| 2 | <str>ab</str> |
+------+---------------+
-- update
SQL> UPDATE t_xml SET c_xml='<num>2</num>' WHERE c_id = 1;
-- select
SQL> SELECT * FROM t_xml;
+------+---------------+
| C_ID | C_XML |
+------+---------------+
| 1 | <num>2</num> |
| 2 | <str>ab</str> |
+------+---------------+
-- delete
SQL> DELETE FROM t_xml WHERE c_id = 1;
-- select
SQL> SELECT * FROM t_xml;
+------+---------------+
| C_ID | C_XML |
+------+---------------+
| 2 | <str>ab</str> |
+------+---------------+