More Related Content More from Hiroyuki Inoue (7) RDBを中核としたXMLDBの開発1. RDBを中核とした
XMLDBの開発
情報科学類 200711429 井上 寛之
アドバイザ教官:北川 博之, 天笠 俊之, 川島 英之
Tuesday, January 15, 13
2. XMLとは
拡張可能なマークアップ言語
データや文書を論理的な構造として表現できる
<筑波大学>
<情報学群>
<情報科学類>
<学生 学籍番号= 200711429 >
<名前>井上 寛之</名前>
......
Tuesday, January 15, 13
3. XMLとは
筑波大学
情報学群
拡張可能なマークアップ言語
学生
情報科学類
井上 寛之
データや文書を論理的な構造として表現できる
<筑波大学>
<情報学群>
<情報科学類>
<学生 学籍番号= 200711429 >
<名前>井上 寛之</名前>
......
Tuesday, January 15, 13
4. データベースとは
特定のテーマに沿ったデータを集めて
管理し、容易に検索・抽出などの再利
用をできるようにしたもの
from Wikipedia: データベース
Tuesday, January 15, 13
5. 関係データベース
(Relational Database)
昨今「データベース」と言えば、「関係データベース」
関係モデルに従った厳密なテーブル設計
SQLによる問い合わせ
列名 データ型 Nullの許容
Id int FALSE
Name nvarchar(100) TRUE
Belong int TRUE
SELECT Name FROM Person WHERE Belong = 3
Tuesday, January 15, 13
6. XMLデータベース
(XML Database)
XML文書をそのままデータ構造として持つDB
または、そのまま持っているように見えるDB
厳密なデータ構造を必要としない → 非常に柔軟
問い合わせ言語には「XPath」「XQuery」を用いる
<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person id="0">
//Belong[@id= 3 ]/Name
<Name>Hiroyuki Inoue</Name>
<Belong id="3" />
</Person>
Tuesday, January 15, 13
7. XMLデータベースの種類
ネイティブXMLデータベース
XML文書をそのまま管理する
リレーショナルXMLデータベース
XML文書をそのまま管理しているように見えるだけ
実はXML文書をテーブル形式に変換し、RDBに格納
Tuesday, January 15, 13
8. 目的
XMLDBがよくわからない
Tuesday, January 15, 13
9. 目的
XMLDBがよくわからない
作るのが手っ取り早い
Tuesday, January 15, 13
10. 作ったもの
RDB
SQL
Record
Tuesday, January 15, 13
11. 作ったもの
XMLDB
RDB
SQL XPath
Record XML
Tuesday, January 15, 13
12. 作ったもの
リ レ ー シ ョ ナ ル X M L デ ー タ ベ ース
XML文書をそのまま管理しているように見えるXMLDB
1. XMLから関係テーブルへの出力
2. CSVファイルからRDBテーブルへの入力
3. XPathからSQLへの変換
4. 最終的なXML出力
Tuesday, January 15, 13
13. 環境
Mac OS X 10.5(Mono)
Emacs/Mono Develop(IDE)
Windows Vista / XP(VMware Fusion)
Visual Studio 2008(Visual C#)
SQL Server 2005 Express Edition
Transact-SQL
Tuesday, January 15, 13
14. 1.XMLから関係テーブルへの出力
SAX : Simple Api for Xml
スタックを用いて効率的にXMLを処理する
文書の始まり/終わり ,
要素の始まり/終わり ,
属性 , テキスト などを見つけて、
イベント駆動的に処理をする
→ 省メモリで巨大なXMLを読む事ができる
Tuesday, January 15, 13
15. 1.XMLから関係テーブルへの出力
<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person id="0">
<Name>Hiroyuki Inoue</Name>
<Belong id="3" />
</Person>
<Person id="1">
<Name>いのうえ ひろゆき</Name>
<Belong id="2" />
</Person>
</Persons>
Tuesday, January 15, 13
16. 1.XMLから関係テーブルへの出力
Persons
Person id= 0 Person id= 1
Name Belong Name Belong
深さ
Tuesday, January 15, 13
17. 1.XMLから関係テーブルへの出力
Persons
Person id= 0 Person id= 1
Name Belong Name Belong
深さ
Tuesday, January 15, 13
18. 1.XMLから関係テーブルへの出力
通し番号、深さ、ノードタイプ、名前、値、ノード番号、パス
0,0,StartElement,Persons,null,1,/Persons
1,1,StartElement,Person,null,1.1,/Persons/Person
2,1,Attribute,id,0,1.1,/Persons/Person
3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name
4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name
5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong
6,1,Attribute,id,3,1.1.2,/Persons/Person
7,1,StartElement,Person,null,1.2,/Persons/Person
8,1,Attribute,id,1,1.2,/Persons/Person
9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name
10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name
11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong
12,1,Attribute,id,2,1.2.2,/Persons/Person
Tuesday, January 15, 13
19. 1.XMLから関係テーブルへの出力
通し番号、深さ、ノードタイプ、名前、値、ノード番号、パス
0,0,StartElement,Persons,null,1,/Persons
4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name
1,1,StartElement,Person,null,1.1,/Persons/Person
2,1,Attribute,id,0,1.1,/Persons/Personencoding="utf-8"?>
<?xml version="1.0"
3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name
<Persons>
4,3,Text,null,Hiroyuki<Person id="0">
Inoue,1.1.1.1,/Persons/Person/Name
5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong
<Name>Hiroyuki Inoue</Name>
6,1,Attribute,id,3,1.1.2,/Persons/Person
<Belong id="3" />
7,1,StartElement,Person,null,1.2,/Persons/Person
</Person>
8,1,Attribute,id,1,1.2,/Persons/Person
<Person id="1">
9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name
<Name>いのうえ ひろゆき</Name>
10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name
<Belong id="2" />
11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong
</Person>
12,1,Attribute,id,2,1.2.2,/Persons/Person
</Persons>
Tuesday, January 15, 13
20. 1.XMLから関係テーブルへの出力
通し番号、深さ、ノードタイプ、名前、値、ノード番号、パス
0,0,StartElement,Persons,null,1,/Persons
4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name
8,1,Attribute,id,1,1.2,/Persons/Person
1,1,StartElement,Person,null,1.1,/Persons/Person
2,1,Attribute,id,0,1.1,/Persons/Personencoding="utf-8"?>
<?xml version="1.0"
<?xml version="1.0" encoding="utf-8"?>
3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name
<Persons>
<Persons>
4,3,Text,null,Hiroyuki<Person id="0">
Inoue,1.1.1.1,/Persons/Person/Name
<Person id="0">
5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong
<Name>Hiroyuki Inoue</Name>
<Name>Hiroyuki Inoue</Name>
6,1,Attribute,id,3,1.1.2,/Persons/Person
<Belong id="3" />
<Belong id="3" />
7,1,StartElement,Person,null,1.2,/Persons/Person
</Person>
</Person>
8,1,Attribute,id,1,1.2,/Persons/Person
<Person id="1">
<Person id="1">
9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name
<Name>いのうえ ひろゆき</Name>
10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name
<Name>いのうえ ひろゆき</Name>
<Belong id="2" />
11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong
<Belong id="2" />
</Person>
12,1,Attribute,id,2,1.2.2,/Persons/Person
</Person>
</Persons>
</Persons>
Tuesday, January 15, 13
21. 2.CSVファイルからRDBテーブルへの入力
0,0,StartElement,Persons,null,1,/Persons
1,1,StartElement,Person,null,1.1,/Persons/Person
2,1,Attribute,id,0,1.1,/Persons/Person
3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name
4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name
5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong
6,1,Attribute,id,3,1.1.2,/Persons/Person
7,1,StartElement,Person,null,1.2,/Persons/Person
8,1,Attribute,id,1,1.2,/Persons/Person
9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name
10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name
11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong
12,1,Attribute,id,2,1.2.2,/Persons/Person
Tuesday, January 15, 13
22. 3.XPathからSQLへの変換
Jay と呼ばれるパーサジェネレータを用いた
が、使い方がよくわからない
Tuesday, January 15, 13
23. 3.XPathからSQLへの変換
Jay と呼ばれるパーサジェネレータを用いた
が、使い方がよくわからない
結局自分で簡単なパーサーを書きました
Tuesday, January 15, 13
24. 3.XPathからSQLへの変換 - 例1
//Belong
文章内のすべての「Belong」要素を取ってこい
SELECT * FROM Table WHERE Path LIKE '/%/Belong%'
Tuesday, January 15, 13
25. 3.XPathからSQLへの変換 - 例2
/Persons/Person[1]
Persons要素の子要素の、1番目のPerson要素を取ってこい
SELECT TOP(1) * FROM Table WHERE Path LIKE '/Persons/Person%'
Tuesday, January 15, 13
27. 4.最終的なXML出力
実装が不十分
出力されるが正しいXMLではない
Tuesday, January 15, 13
28. まとめ
コード量
4000行前後(GUI部分を除く)
プロジェクトはオープンソースに
http://www.codeplex.com/floridum
Tuesday, January 15, 13
29. まとめ
これまであまり意識しなかった「巨大なXML文書」
を意識したコードを書く事ができた
1GByte級のXMLを変換する事も大丈夫!
XML関連だけではなく、パーサ/パーサジェネレー
タなどの知識も身に付いた
しかし作り込みが甘いので、改善したい
Tuesday, January 15, 13