跳轉到內容

XML - 管理資料交換/資料庫和 XML

來自華夏公益教科書,開放的書籍,為開放的世界



上一章 下一章
XMLHTTP SyncML



學習目標
  • 瞭解原生 XML 資料庫
  • 瞭解可用的轉換技術
  • 建立表並檢索資訊


原生 XML 資料庫

[編輯 | 編輯原始碼]

術語原生 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


IBM 技術

[編輯 | 編輯原始碼]

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 5.1

[編輯 | 編輯原始碼]

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>
');


XML 函式

[編輯 | 編輯原始碼]

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 版本)。


快速 Windows 安裝。

詳細資訊可以在線上手冊中找到

  • 以及更多內容,請參閱 手冊
華夏公益教科書