XML - 管理資料交換/資料庫和 XML
| 上一章 | 下一章 |
| ← XMLHTTP | SyncML → |
學習目標
|
術語原生 XML 資料庫:在 1999 年後變得流行起來,當時軟體 AG 公司釋出了其原生 XML 伺服器 Tamino 的第一個版本,其中包括一個原生 XML 資料庫。原生資料庫的定義是
"[d]efines a (logical) model for an XML document and stores and retrieves documents according to that model." (Bourret, 2002)"
為了對 XML 中的資料進行建模,使用兩種主要方法:資料中心文件和文件中心文件。
- 資料中心文件(用於資料傳輸)具有相當規則的結構,順序通常無關緊要,並且混合內容很少或沒有。
- 文件中心文件(通常用於人類消費)具有不太規則或不規則的結構,元素的順序非常重要,並且包含大量混合內容。
原生資料庫的示例
| 產品 | 開發者 | 許可證 | 資料庫型別 |
|---|---|---|---|
| Tamino | Software AG | 商業 | 專有。透過 ODBC 關係型。 |
| XediX 多媒體解決方案 | XediX Tera 解決方案 | 商業 | 專有 |
| eXist | Wolfgang Meier | 開源 | 關係型 |
| dbXML | dbXML Group | 開源 | 專有 |
| Xindice | Apache 軟體基金會 | 開源 | 專有(基於模型) |
eXist 是一項開源努力,旨在開發一個原生 XML 資料庫系統,與現有的 XML 開發工具(如 Apache 的 Cocoon)緊密整合。資料庫易於部署,可以獨立執行,在 servlet 引擎內部執行,或直接嵌入應用程式。
eXist 中提供的一些功能,以及大多數原生 XML 資料庫中都可以找到的功能是
- 無模式儲存 - 文件不必與模式或文件型別關聯,這意味著它們只允許格式良好。
- 集合 - 集合在檔案系統中扮演類似於目錄的角色。提交查詢時,使用者可以選擇集合層次結構的特定部分,甚至可以選擇資料庫中包含的所有文件。
- 查詢語言 - 原生 XML 資料庫支援的最流行的查詢語言是 XPath(帶有跨多個文件查詢的擴充套件)和 XQuery。
IBM、Microsoft、Oracle 和 Sybase 等資料庫供應商已經開發了工具來幫助將 XML 文件轉換為關係型表。
讓我們看看 IBM 和 Oracle
DB2 XML 擴充套件器透過使用者定義函式和儲存過程提供對 XML 資料的訪問、儲存和轉換。它提供了 2 種關鍵儲存模型:XML 列和XML 集合。
1. XML 列:將整個 XML 文件作為 DB2 列資料進行儲存和檢索。當 XML 文件已經存在或需要以其實體儲存 XML 文件時,建議使用 XML 列。
2. XML 集合:從關係型表的集合中組合 XML 文件。
資料訪問定義 (DAD) 檔案用於 XML 列和 XML 集合方法,以定義資料庫表和 XML 文件結構之間的“對映”。
<Xcollection> 指定 XML 資料要從 XML 文件分解到關係型表的集合,或者要從關係型表的集合組合到 XML 文件。
DAD 檔案使用以下節點型別定義 XML 文件樹結構
- root_node - 指定文件的根元素。
- element_node - 標識元素,可以是根元素或子元素。
- text_node - 表示元素的 CDATA 文字。
- attribute_node - 表示元素的屬性。
<?xml version="1.0"?>
<!DOCTYPE DAD SYSTEM ""c:\dxx\samples\db2xml\dtd\dad.dtd">
<DAD>
...
<Xcollection>
<SQL_stmt>
...
</SQL_stmt>
<prolog>?xml version="1.0"?</prolog>
<doctype>!DOCTYPE Order SYSTEM
""c:\dxx\samples\db2xml\dtd\getstart.dtd""</doctype>
<root_node>
<element_node name="Order"> --> Identifies the element <Order>
<attribute_node name="key"> --> Identifies the attribute "key"
<column name="order_key"/> --> Defines the name of the column,
"order_key", to which the
element and attribute are
mapped
</attribute_node>
<element_node name="Customer"> --> Identifies a child element of
<Order> as <Customer>
<text_node> --> Specifies the CDATA text for
the element <Customer>
<column name="customer"> --> Defines the name of the column,
"customer", to which the child
element is mapped
</text_node>
</element_node>
...
</element_node>
...
</root_node>
</Xcollection>
</DAD>
Oracle 的XML SQL 實用程式 (XSU) 使用一個模式對映,該對映定義瞭如何將表和檢視(包括物件關係功能)對映到 XML 文件。Oracle 將資料庫中的物件引用鏈轉換為 XML 元素的分層結構。
CREATE TABLE Customers
{
FIRSTNAME VARCHAR,
LASTNAME VARCHAR,
PHONENO INT,
ADDRESS AddressType, // object reference
}
CREATE TYPE AddressType as OBJECT
{
ZIP VARCHAR (100),
CITY VARCHAR (100),
STREET VARCHAR (100),
}
從給定的物件關係模型生成的相應 XML 文件如下所示
<?xml version="1.0"?>
<ROWSET>
<ROW num="1">
<FIRSTNAME>JOHN</FIRSTNAME>
<LASTNAME>SMITH</LASTNAME>
<PHONENO>7061234567</PHONENO>
<ADDRESS>
<ZIP>30601</ZIP>
<CITY>ATHENS</CITY>
<STREET>123 MAIN STREEET</STREET>
</ADDRESS>
</ROW>
<!-- additional rows ... -->
</ROWSET>
XSU 可用於在 Java 環境中執行查詢並從資料庫中檢索 XML。
import oracle.jdbc.driver.*;
import oracle.xml.sql.query.OracleXMLQuery;
import java.lang.*;
import java.sql.*;
// class to test XML document generation as String
class testXMLSQL {
public static void main(String[] args)
{
try {
// Create the connection
Connection conn = getConnection("root","");
// Create the query class
OracleXMLQuery qry = new OracleXMLQuery(conn,
"SELECT * FROM Customers");
// Get the XML string
String str = qry.getXMLString();
// Print the XML output
System.out.println("The XML output is:\n"+str);
// Always close the query to get rid of any resources..
qry.close();
} catch(SQLException e) {
System.out.println(e.toString());
}
}
// Get the connection given the user name and password.!
private static Connection getConnection(String username,
String password)
throws SQLException
{
// register the JDBC driver..
DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());
// Create the connection using the OCI8 driver
Connection conn =
DriverManager.getConnection(
"jdbc:oracle:thin:@dlsun489:1521:ORCL",username,password);
return conn;
}
}
XPath 是一種用於定址 XML 文件部分的語言,是 XSLT 和 XPointer 使用的通用定位器。XPath 表示式是一系列由“ / ”分隔的定位步驟。每一步都選擇一組節點,這些節點成為下一步的當前節點。表示式選擇的節點集是在按順序處理每個步驟後剩餘的節點。
XQuery 是一種由全球資訊網聯盟 (W3C) 開發的查詢語言。這項雄心勃勃的任務是開發第一個用於查詢 Web 文件的全球標準。XQuery 是一種通用的標記語言,能夠標記各種資料來源的資訊內容,包括結構化和半結構化文件、關係型資料庫和物件儲存庫。
MySQL 有一個命令列工具用於對 MySQL 資料庫執行查詢;它有一個選項可以使用 XML 作為它們的輸出格式。MySQL 還允許轉換為 XML;更多資訊可以在 將 MySQL 轉換為 XML 中找到。MySQL 允許使用者執行任何 SQL 查詢。mysqldump 允許使用者指定要轉儲的表以及指定 where 子句來限制要轉儲的行。在其 MySQL 5.1 的 Beta 版本中,添加了一些功能,包括新的 **XML 函式**。
為了理解這些新功能,我們將使用以下表格
CREATE TABLE Customers (doc VARCHAR(150));
INSERT INTO Customers VALUES
('
<person id="1">
<firstname>John</firstname>
<lastname>Smith</lastname>
<phoneno>123-5678</phoneno>
</person>
');
INSERT INTO Customers VALUES
('
<person id="2">
<firstname>Aminata</firstname>
<lastname>Cisse</lastname>
<phoneno>123-5679</phoneno>
</person>
');
INSERT INTO Customers VALUES
('
<person id="3">
<firstname>Lamine</firstname>
<lastname>Smith</lastname>
<phoneno>123-5680</phoneno>
</person>
');
MySQL 5.1 版本具有用於搜尋和更改 XML 文件的函式:**ExtractValue()** 和 **UpdateXML()**。
- EXTRACTVALUE (XML_document, XPath_string);
此函式採用 2 個字串引數:第一個引數對應於 XML_document 字串,第二個引數是 XPath_string(XPath 表示式/定位器)。這將導致返回包含文件中值的字串。
mysql> SELECT EXTRACTVALUE(doc,'//firstname') FROM Customers; +------------------------------------------+ | EXTRACTVALUE(doc,'//firstname') | +------------------------------------------+ | John | | Aminata | | Lamine | +------------------------------------------+ 3 rows in set (0.01 sec)
mysql> SELECT ExtractValue(doc,'/person[@id="3"]/firstname') as fname FROM Customers; +---------+ | fname | +---------+ | | | | | Lamine | +---------+ 3 rows in set (0.02 sec)
- UPDATEXML (XML_document, XPath_string, new_value);
此函式採用 3 個字串引數:前兩個引數類似於與 extractValue() 一起使用的引數,XML_document 和 XPath_string。第三個引數是將替換找到的值的新值。然後此函式將返回已更改的 XML。
mysql> SELECT UpdateXML(doc,'/person[@id="3"]/phoneno', '<phoneno>111-2233<phoneno>') FROM Customers;
+-------------------------------------------------------------------------------
----------------------------------------------------+
| UpdateXML(doc,'/person[@id="3"]/phoneno','<phoneno>111-2233<phoneno>')
|
+-------------------------------------------------------------------------------
----------------------------------------------------+
|
<person id="1">
<firstname>John</firstname>
<lastname>Smith</lastname>
<phoneno>123-5678</phoneno>
</person>
|
|
<person id="2">
<firstname>Aminata</firstname>
<lastname>Cisse</lastname>
<phoneno>123-5679</phoneno>
</person>
|
|
<person id="3">
<firstname>Lamine</firstname>
<lastname>Smith</lastname>
<phoneno>111-2233<phoneno>
</person>
|
+-------------------------------------------------------------------------------
----------------------------------------------------+
3 rows in set (0.00 sec)
目前(04/05/06)MySQL 5.1 並沒有隨安裝程式一起提供(Beta 版本)。
詳細資訊可以在線上手冊中找到
- 以及更多內容,請參閱 手冊。