跳轉到內容

XQuery/XML 到 SQL

來自維百科,開放世界的開放書籍

表格 XML 例如

<books>
    <book>
        <title>Introduction to XQuery</title>
        <description>A beginner's guide to XQuery that covers sequences and FLOWR expressions</description>
        <type>softcover</type>
        <sales-count>155</sales-count>
        <price>19.95</price>
    </book>
    <book>
        <title>Document Transformations with XQuery</title>
        <description>How to transform complex documents like DocBook, TEI and DITA</description>
        <type>hardcover</type>
        <sales-count>105</sales-count>
        <price>59.95</price>
    </book><!-- ...more books here.... -->
</books>

可以透過生成建立語句匯出到 SQL 表中

 declare variable $local:nl := "
";


declare function local:element-to-SQL-create($element) {
  ("create table ", name($element), $local:nl ,
    
      string-join(
         for $node in $element/*[1]/*
          return 
              concat ("     ",name($node) , " varchar(20)" ),
              concat(',',$local:nl)
          ),
          ";",$local:nl
   )
 };

以及插入語句

declare function local:element-to-SQL-insert ($element) {
  for  $row in $element/*
       return
        concat (
          " insert into table ",
          name($element), 
          " values (",
          string-join( 
                  for $node in $element/*[1]/* 
                  return  concat('"',data($row/*[name(.)=name($node)]),'"'),
                  ","
                  ),
          ");",$local:nl
         )
};

並在指令碼中使用這兩個函式

declare option exist:serialize  "method=text media-type=text/text";
let $xml := doc("/db/apps/xqbook/data/catalog.xml")/*
return
   (local:element-to-SQL-create($xml),
    local:element-to-SQL-insert($xml)
   )

生成 SQL

此 SQL 非常通用,由於缺乏架構,所有欄位均定義為 varchar。有了架構,可以在 SQL 中定義適當的資料型別。

華夏公益教科書