>  > 【関西、関東限定】取付サービス品CR50 エスティマ ステンマフラー【トヨタモデリスタ】エステイマ 50系 後期 MODELLISTA SELECTION スポーツマフラー 2.4L 2WD G/Xグレード用
CRIMSON(クリムソン) CLUB LINEA L747D KING LABEL (クラブリネア L747D キングレーベル) 22インチ 11.5J PCD:108 穴数:5 inset:37 DISK TYPE:LOW カラー:ブロンズクリア [ホイール1本単位]/H 17インチノア ハイブリッド80系 3ナンバーWORK エモーション T7R マットカーボン 7.0Jx17Bluearth エース AE50 205/50R17

【関西、関東限定】取付サービス品CR50 エスティマ ステンマフラー【トヨタモデリスタ】エステイマ 50系 後期 MODELLISTA SELECTION スポーツマフラー 2.4L 2WD G/Xグレード用

PostgreSQLでXMLを処理してみよう!(最終回)(1)

第6回 (最終回) PostgreSQLによるXML処理落ち穂拾い
-XML Schema検証アプリケーションとの連携、PostgreSQL のXML名前空間対応-

響 楽人

 

G/Xグレード用 SELECTION エスティマ エスティマ 後期 2.4L 【関西、関東限定】取付サービス品CR50 ステンマフラー【トヨタモデリスタ】エステイマ SELECTION スポーツマフラー 2WD MODELLISTA 50系

2009年3月に連載第一回を掲載してから早いもので半年が経ちました。PostgreSQLでのXMLサポート機能についてはこれまでの連載でほぼ網羅しましたので、最終回となる今回はまず、PostgreSQLには組み込まれていないXML Schemaによるデータチェックの方法について解説します。また、XMLの重要な概念で、PostgreSQLも対応しているXML名前空間についても説明します。

2. XML Schema検証アプリケーションとPostgreSQLとの連携

XML Schema検証アプリケーションはPostgreSQLに組み込まれていないため、現状ではXML SchemaによるXMLデータの妥当性検証 (XMLデータのタグ付けがXML Schemaで定義したとおりに行われているかどうかの検証) は、外部の一般アプリケーションを使って行う必要があります。XML Schemaに対応したXMLプロセッサは数多く存在しますが、その中でも定評がありしかもフリーで利用できるApachプロジェクトのXerces (ザーセス) をこの記事では使います。以下に、このXercesを使ってXMLデータの妥当性検証を行う方法、Javaプログラムからプロセッサを呼び出し、妥当性検証を行ってからPostgreSQLのテーブルにXMLデータを格納する方法を紹介します。

2.1 XML Schemaとは何か、その必要性

これまで何回か登場したmeiboテーブルのwork_history列 (XML型) の内容として書いたXMLデータのタグ (要素) の構造を見てみると、最上位にwork-record要素があり、経歴ごとにcareer要素が繰り返され、career要素の子要素のperiodの下にはstart要素とend要素がある……という具合に階層的に構造化されています。

XML Schemaは、このようなXMLの階層構造に関する規則をあらかじめ定めるための規格です。事前に定めた階層構造に従って記述されたXMLデータであることが分かっていれば、特定のデータにたどり着く経路をXPathを使って的確に記述できます。

このようにXML Schemaを使えば、meiboテーブルのwork_history列でこれまで暗黙のうちにXMLデータの構造をルール化して使っていたものをXML Schemaという標準規格を使って定義することができます。これにより、データベースに格納しようとしているデータの構造が事前に定義したXML Schemaと合っているかどうかをアプリケーションを使ってチェックすることができるようになります。

2.2 XML Schema検証とXMLプロセッサ

XMLデータの記述内容を規定するためにW3Cが開発したスキーマ言語としては、XML1.0規格 (1998年制定) の中で規定されている「DTD (Document Type Definition:文書型定義)」と、その後DTDを発展させた規格として独立して規格化した「XML Schema」 (2001年制定) の二つがあります。現在主流となっているXML Schemaの大きな特徴は、DTDと比べ、要素の内容や属性値のデータ型を詳細に定義できること、XML名前空間の使用を前提に設計されていること、スキーマ自体がXMLで記述されている (タグを使って記述する) ことです。

ところで、XMLデータのチェックには2段階あるのでその点留意が必要です。たとえば、XMLデータをPostgreSQLに格納しようとしたとき、以下のようなエラーが返されることがあります。

testdb=# CREATE TABLE temp(a xml);
CREATE TABLE
testdb=# INSERT INTO temp(a) VALUES('<a>111<b>222</a>');
ERROR: invalid XML content
DETAIL: Entity: line 1: parser error : Opening and ending tag mismatch: b line 1 and a
<a>111<b>222</a>
               ^
Entity: line 1: parser error : Premature end of data in tag a line 1
<a>111<b>222</a>
               ^
Entity: line 1: parser error : chunk is not well balanced
<a>111<b>222</a>

これは、要素<b>に終了タグがないためXMLデータの書き方が基本的に間違っていることを示するエラーです。XML Schemaで事前に定義されたタグの構造に合わないということを示すエラーではありません (そもそもここでXML Schemaは使っていませんのでチェックを行うことができません) 。

このようにXMLデータのチェックには、XMLのタグ記述ルールに従っているかどうか (開始タグと終了タグの対がきちんと書かれているなど) のチェックと、スキーマと照らし合わせた構造のチェックの2つがあります。規格の用語を使うと、前者は「整形式XML文書 (well-formed XML document)」としてのチェック、後者は「妥当なXML文書 (valid XML document)」としてのチェックということになります。

※XML1.0規格では、上記のように 、整形式XMLの「整形式」は「well-formed」、妥当なXMLの「妥当な」は「valid」という英語になっています。これを知っていると、上記ERRORメッセージの「invalid XML content」が「妥当なXMLではない」という意味を表しているように読めて 【店舗塗装サービス】【ロエン / トミーカイラ】【 AQUA(アクア) RR 前期MODEL NHP10 2011.12~2014.12 】 RACINGSTYLE KIT D [材質] FRP(塗装済)、PostgreSQLがXMLSchemaによる検証も行っていると誤解するかもしれませんが、PostgreSQLにはXML Schemaによる検証機能は含まれていませんので注意して下さい。

XMLプロセッサは、このように「整形式XML文書 (well-formed XML document)」としてのチェックと「妥当なXML文書 (valid XML document)」としてのチェックの2つを行っていることになります。 (XMLプロセッサには、整形式XML文書としてのチェックまでしか行わないものもありますが、今回使用したXercesなどはXML Schemaによる妥当なXML文書のチェックまで行います。)

この様子を図にすると以下のようになります。

図1. XML Schemaを使ったXMLプロセッサによるXMLデータ検証

2.3. XML SchemaとXMLデータ

第3回から使用しているmeiboテーブルのwork_history列にあるXMLデータはこれまでタグの構造チェックを行わずに格納していましたので、今回はそのXMLデータを検証して入れるというシナリオを考えます。

まず、work_history列のデータ構造をXMLSchemaで表します。 (※XML Schemaの構文についてはここでは説明しませんので、XMLの参考書をご覧ください。)

XML Schemaファイル (workhistory.xsd)

<?xml version="1.0" encoding="Shift_JIS"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
<xsd:element name="work-record">
 <xsd:complexType>
 <xsd:sequence>
 <xsd:element ref="career" minOccurs="0" maxOccurs="unbounded"/>
 </xsd:sequence>
 </xsd:complexType>
</xsd:element>
<xsd:element name="career">
 <xsd:complexType>
 <xsd:sequence>
 <xsd:element ref="period" minOccurs="1" maxOccurs="1"/>
 <xsd:element ref="content" minOccurs="1" maxOccurs="1"/>
 <xsd:element ref="role" minOccurs="1" maxOccurs="1"/>
 </xsd:sequence>
 </xsd:complexType>
</xsd:element>
<xsd:element name="content" type="xsd:string"/>
<xsd:element name="role" type="xsd:string"/>
<xsd:element name="period">
 <xsd:complexType>
 <xsd:sequence>
 <xsd:element ref="start" minOccurs="1" maxOccurs="1"/>
 <xsd:element ref="end" minOccurs="0" maxOccurs="1"/>
 </xsd:sequence>
 </xsd:complexType>
</xsd:element>
<xsd:element name="start" type="xsd:string"/>
<xsd:element name="end" type="xsd:string"/>
</xsd:schema>

スキーマに沿ったXMLデータも用意します。これはmeiboテーブルにおける“生田靖”さん用のXMLデータです。

XMLデータ (record001.xml)

<?xml version="1.0" encoding="Shift_JIS"?>
<work-record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:/pgsqlxml/workhistory.xsd">
<career>
 <period>
 <start>1970-04-01</start>
 <end>1980-03-31</end>
 </period>
 <content>製造業向け購買管理システムの開発、大手流通業向け販売管理システム開発</content>
 <role>プログラマー</role>
</career>
<career>
 <period>
 <start>1980-04-01</start>
 <end>1985-03-31</end>
 </period>
 <content>金融機関向け社内Webシステム開発</content>
 <role>プロジェクトリーダー</role>
</career>
<career>
 <period>
 <start>1985-04-01</start>
 <end/>
 </period>
 <content>IT戦略部にて規格提案業務</content>
 <role>マネージャー</role>
</career>
</work-record>

※今回使用したXMLデータの文字コードがShift_JISであることを示すため、先頭のXML宣言 (<?xml……) においてencoding="Shift_JIS"と指定しています。

2行目にあるwork-record要素の中のxsi:NonamespaceSchemaLocation属性で トーヨータイヤ TOYOTIRES オープンカントリー RT OPEN COUNTRY R/T 165/60R15 サマー タイヤ ホイールセット 15インチ オフロード仕様 夏用 エクストリーム J XTREME-J KK03 15×4.5J+45 4/100、

【関西、関東限定】取付サービス品CR50 エスティマ ステンマフラー【トヨタモデリスタ】エステイマ 50系 後期 MODELLISTA SELECTION スポーツマフラー 2.4L 2WD G/Xグレード用商品が大好評


185/55R15 サマータイヤ タイヤホイールセット 【送料無料】Verthandi YH-S25 15x5.5 +43 100x4 BK/POLISH + NANKANG NS-2 ナンカン スポーツタイヤ (185-55-15 185/55/15 185 55 15)夏タイヤ 15インチ 4本セット 新品


【関西、関東限定】取付サービス品CR50 エスティマ ステンマフラー【トヨタモデリスタ】エステイマ 50系 後期 MODELLISTA SELECTION スポーツマフラー 2.4L 2WD G/Xグレード用 トヨタ ハリアーハイブリッド 60系 20インチ アルミホイール 一台分(4本) LEONIS GREILA α (レオニス グレイラアルファ) BMCミラーカット アルミ

↓↓↓YOKOHAMA ヨコハマ ice GUARD6 アイスガード ig60 スタッドレス スタッドレスタイヤ 205/55R16 WEDS ウェッズ Leonis レオニス VX ホイールセット 4本 16インチ 16 X 7 +53 5穴 114.3;205/45R17 88W XL FALKEN ファルケン ZIEX ZE914F ジークス ZE914F WORK EMOTION D9R ワーク エモーション D9R サマータイヤホイール4本セット;カワサキ純正 ステータ 21003-0138 JP店, GK3-6 フィット GK3-6 FIT スプリング【タナベ】フィット GK3 MC後 SUSTEC NF210 フロント1本, 185/60R15 サマータイヤ タイヤホイールセット weds IRVINE F01 15x6 +45 100x4 HS + Rivera Pro 2 【送料無料】 (185/60/15 185-60-15 185/60-15) 夏タイヤ 15インチ, TOYOTIRES トーヨー ナノエナジー3プラス NANOENERGY3plus サマータイヤ 215/45R18 MANARAY RMP-025F ホイールセット 4本 18インチ 18 X 7 +48 5穴 114.3, 【店舗取付サービス】【JB1-4 ライフ ブリッツ】ライフ JB1/2 NUR-SPEC K マフラー JB1 2WD 用;【送料無料】 225/40R18 18インチ YOKOHAMA ヨコハマ アドバンレーシング RSII 7.5J 7.50-18 HANKOOK ハンコック ヴェンタス R-S4 Z232 サマータイヤ ホイール4本セット 17インチ サマータイヤ セット【適応車種:ラクティス(120系 S以外)】WORK MCOレーシング タイプCS マットブラック 7.0Jx17Bluearth エース AE50 205/45R17↓↓↓プジョー 508 アロイホイール Style 07, USウィンドウルーバー 2ピースリアウィンドウルーバークォーターサイドスクープカバーGT 5ベント用フォードマスタング#y 2pcs Rear Window Louvers Quarter Side Scoop Cover GT 5 Vents For Ford Mustang #y, DIXCEL/ディクセル ブレーキパッド タイプR01 フロント左右セット ALFAROMEO GT 2.0 JTS 年式04/06~12/04 8RCHJF93720L R012511007, 【送料無料】デイトナ エアロショートスクリーン アドレスV125/G (70625), 【USA在庫あり】 ストンプグリップ STOMPGRIP タンクグリップ(小) クリア 674005 HD

【関西、関東限定】取付サービス品CR50 エスティマ ステンマフラー【トヨタモデリスタ】エステイマ 50系 後期 MODELLISTA SELECTION スポーツマフラー 2.4L 2WD G/Xグレード用 【★送料無料キャンペーン中】 【D2 レーシングスポーツ】E 39 540 95~03 5 X 120スポーツキャリパー(ダストブーツ無) 8 POT Sport Caliper 356X32 フローティング ズーム ダウンフォースHG 1台分 ダウンサス V40 4B4184W ZVO016007SHG 取付セット アライメント込 Zoom ダウンスプリング バネ ローダウン コイルスプリング【店頭受取対応商品】 国産タイヤ・アルミホイール 新品 4本セット ◆マルカサービス シュナイダー セイバーロンド◆225/55R17 17インチ (225/55-17)新品トーヨー ナノエナジー 3 + バランス調整済み! パーツ, 16インチ サマータイヤ セット【クー(M400系)】A-TECH ファイナルスピード GR-ボルト レッドフレアブラック 6.0Jx16ZIEX ZE914F 195/45R16, 【送料無料】 205/50R16 16インチ BBS JAPAN BBS RE-L2 ブラックダイヤカット 6.5J 6.50-16 DELINTE デリンテ DH2(限定) サマータイヤ ホイール4本セット, 【関西、関東限定】取付サービス品ボンネット ( フード )【ギブソン】【1・2・3・4型・ハイエース200系ワイドミドル】GRAFAM EURO ボンネット [2JZ]ノーブルパールトーニングII, ブリヂストン PLAYZ プレイズ PX-RV サマータイヤ 215/55R17 WEDS ウェッズ Leonis レオニス NAVIA 05 ナビア05 ホイールセット 4本 17インチ 17 X 7 +42 5穴 114.3

CRIMSON(クリムソン) CLUB LINEA L747D (クラブリネア L747D) 21インチ 9.5J PCD:120.65 穴数:5 inset:28 DISK TYPE:HIGH カラー:プレミアムホワイトポリッシュ [ホイール1本単位]/H

↓↓↓↓↓↓


↓↓↓↓↓↓
↓↓↓↓↓↓

ピーエムシー PMC 車高調キット 73mm I-TYPE 10X20 61-4301 JP店, Artina アルティナ ラグジュアリーシートカバー 3680 アイボリー×オレンジ ライフ JC1/JC2, Scorpion Verde AllSeason 275/50R20 113W XL B ベントレー スコーピオン ヴェルデ オールシーズン 275/50R20ScorpionVerdeAllSeason275/50R20 275/50R20スコーピオンヴェルデオールシーズン275/50R20 275/50R20スコーピオン275/50R20, ダウンサス 三菱 パジェロ(V23W)4WD H3/1~11/9 リア用 ZOOM ローダウン サスペンション ダウンフォース【MITSUBISHI】【RCP】02P09Jul16, Project μ プロジェクト ミュー ブレーキパッド EURO ECO リア BMW E36 CD28 328i

ミシュラン X-ICE XI3+ スリープラス エックスアイス スタッドレス スタッドレスタイヤ 205/60R16 ブリヂストン BALMINUM Z5 ホイールセット 4本 16 X 6.5 +48 5穴 114.3;パワーハウス アミューズ R1チタン RSサイレント STTI 日産 ニッサン フェアレディーZ バージョンニスモ Z34用 【マフラー】【自動車パーツ】power house amuse R1 TITAN RS SILENT【車関連の送付先指定で送料無料】 TOYOTIRES トーヨー プロクセス R1R PROXES サマータイヤ 195/55R15 WEDS ウェッズ RIZLEY ライツレー ZEFICE X ホイールセット 4本 15インチ 15 X 5.5 +42 4穴 100 YOKOHAMA ヨコハマ エコス ECOS ES31 サマータイヤ 185/65R15 ブリヂストン BALMINUM T10 ホイールセット 4本 15 X 6 +45 5穴 114.3;【送料無料】 245/70R16 16インチ MKW MK-46 8J 8.00-16 YOKOHAMA ヨコハマ ジオランダー H/T G056 サマータイヤ ホイール4本セット フジコーポレーション

ミシュラン X-ICE XI3+ スリープラス エックスアイス スタッドレス スタッドレスタイヤ 245/45R18 RAYS GRAM LIGHTS 57FXX CJ SPEC 18 X 7.5 +50 5穴 100;165/45R15 サマータイヤ タイヤホイールセット 【送料無料】 LEONIS WX 15x4.5 45 100x4 HSMC + Economist ATR-K 165/45R15 75V XL (165/45/15 165-45-15) 夏タイヤ 15インチ

、先に作成したXMLSchemaファイルを指定しています。

これらのファイルを置くフォルダを一つを作成しておきます (この記事ではC:\pgsqlxmlとしました。後述のXercesでは、フォルダー名に日本語が使われているとデータを読み込めないというエラーが出る場合があるようですので注意して下さい。)

2.4 Xercesを使ったXML Schemaによる検証

XercesはオープンソースプロジェクトのApacheから無料で入手できるXMLプロセッサです。http://xerces.apache.org/に様々なバージョンのXercesが公開されていますが、この記事ではXerces2 Javaを使いました。準備として、ダウンロードしたフォルダを解凍してProgramFilesなどにおき ■HKS マフラー Espremium【32021-AT016】ノア DBA-ZRR75W 3ZR-FAE, 3ZR-FE 07/06-13/12、フォルダの中のxercesImpl.jarとxercesSamples.jarのフルパスを環境変数CLASSPATHに指定します。

CLASSPATHの設定方法は図2の通りです。

図2.CLASSPATHの設定方法 (Windows環境) (clickで拡大します)

また、Xercesを使うにはJava環境も必要です。Java環境にはJDK (開発環境) とJRE (実行のみ) があります。Xerces自体はJREで動きますが、後でご紹介するXML Schemaによる検証とPostgreSQLへのデータ投入を一括して行うJavaのプログラムをコンパイルして実行するにはJDKが必要になります。

Xercesを使った単体での検証はPostgreSQLとは直接関係ありませんので、Windowsのスタートメニューからコマンド・プロンプトを起動し、「XML Schemaの説明」で作成したスキーマとXMLインスタンスを保存したフォルダへディレクトリを移動します。

C:\pgsqlxml フォルダへ移動する:

C:\>cd C:\pgsqlxml

xercesでrecord001.xmlファイルのスキーマチェックを実行する:

C:\pgsqlxml>java sax.Counter -v -s -f record001.xml
record001.xml: 156 ms (19 elems, 1 attrs, 0 spaces, 180 chars)

エラーが出ていませんので、XML Schemaによる検証で問題なかったということで、record001.xmlは妥当なXML文書であるということが確認できました。

2.5 XML Schemaによる検証が済んだXMLデータをPostgreSQLに格納する

前項でXercesを使って検証したrecord001.xmlをPostgreSQLのmeiboテーブルに格納しましょう。先ほどのコマンド・プロンプトは終了し、PostgreSQLのコマンド・プロンプトを開きます。

psqlでデータベースに接続します:

C:\Program Files\PostgreSQL\8.3\bin>psql testdb postgres
Password for user postgres:

第3回から使っているmeiboテーブルの中身を一旦削除します:

testdb=# DELETE FROM meibo;
DELETE 5

変数fooにrecord001.xmlの内容を展開して代入します(この手法については、後の“【解説】psqlの変数差し換え機能を利用したファイル挿入”を参照) :

testdb=# \set foo '''' `type C:\pgsqlxml\record001.xml` ''''

meiboテーブルにid,nameなどの必要なデータと、変数fooに代入したXMLデータを格納します:

testdb=# INSERT INTO meibo(id,name,department,age,email,work_history) 
VALUES(1031,'生田靖','IT事業統括部',45,'ikuta@abcd.com',:foo);
INSERT 0 1

内容を確認してみます:

testdb=# SELECT work_history FROM meibo;
 work_history
-----------------------------------------------------------------------------------\r
<work-record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamesp
aceSchemaLocation="C:/pgsqlxml/workhistory.xsd">\r
 <career>\r
 <period>\r
 <start>1970-04-01</start>\r
 <end>1980-03-31</end>\r
 </period>\r
 <content>製造業向け購買管理システムの開発、大手流通業向け販売管理システム開発</content>\r
 <role>プログラマー</role>\r
 </career>\r
 <career>\r
 <period>\r
 <start>1980-04-01</start>\r
 <end>1985-03-31</end>\r
 </period>\r
 <content>金融機関向け社内Webシステム開発</content>\r
 <role>プロジェクトリーダー</role>\r
 </career>\r
 -- More --

【解説】psqlの変数差し換え機能を利用したファイル挿入

XMLデータのファイルrecord001.xmlの内容を展開して挿入するのにpsqlツールの\setコマンドを利用した「SQL差し替え」と呼ばれる変数差し替え機能を使うことができます。セットされた変数の値の呼び出しには変数名の先頭に「:」をつけます。ファイルの内容をコピーする場合は以下のように使います。

\set content '''' `type my_file.txt` ''''
 INSERT INTO my_table VALUES (:content);

※Windows環境では上記のようにtypeですが、Linuxの場合はcatです。この機能ついて詳しくは PostgreSQL 文書「psql」の「高度な機能」の中の「変数」および「SQL差し替え」の項を参照してください。

2.6 XML Schemaによる検証からPostgreSQL格納までの一括処理―Javaプログラムを使って―

ここまでの説明では、手作業でXML Schema検証を行い、それをPostgreSQLに格納しましたが、このような処理を何度も繰り返し行うのは面倒です。そこで、XML Schemaによる検証を行ったXMLデータをPostgreSQLに格納するまでの処理を一括して行うJavaプログラムを書くことにします。

このプログラムを実行するのに必要な環境として、Java開発環境 (JDK) ビルシュタイン ハイパフォーマンスショック B6 フロント/リア P30-0040×2/B36-0161×2 ポルシェ 924/944 1978年~1984年08月、Xerces、JavaからPostgreSQLに接続するためのJDBCドライバが必要です。

皆さんのコンピュータにJDKが入っていない場合には、まずはJDKをインストールして環境設定 (PATH環境変数の設定) を行ってください。

JDBCドライバについては、PostgreSQL のJDBC Driverというサイト (http://jdbc.postgresql.org/download.html) から入手できます (この記事では「JDBC4 Postgresql Driver, Version 8.4-701」を使いました) 。ここからダウンロードされるjarファイルを適当なフォルダに置き (例えばC:\postgresql-8.4-701.jdbc4.jar) 、CLASSPATH環境変数に追加します (「2.4 Xercesを使ったXML Schemaによる検証」のCLASSPATH設定方法と同様) 。

Xercesによる検証とPostgreSQLへの挿入を行うJavaプログラム (validateandinsert.java)

import javax.xml.parsers.*;
import org.xml.sax.*;
import java.sql.*;
import java.io.*;
public class validateandinsert {
 public static void main(String[] args) {
 try {
 // スキーマ検証を行うメソッドの呼び出し
 vaildation(args[0]);
 // XMLファイルを読み込んで、文字列にする
 String xmlstring = xmlfileopen(args[0]);
 // XMLファイルをPostgreSQLに挿入する
 insert(xmlstring);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 /**
 * XMLファイルのスキーマ検証を行う。SAXを使用したスキーマ検証。
 * @param xmlfile XMLファイルのフルパス
 */
 public static void vaildation(String xmlfile) {
 try {
 // SAXをインスタンス化する
 SAXParserFactory saxfa = SAXParserFactory.newInstance();
 XMLReader xmlr = saxfa.newSAXParser().getXMLReader();
 // スキーマ検証 (XML Schema) を行うための、機能設定をSAXインスタンスに行う
 xmlr.setFeature("http://xml.org/sax/features/validation", true);
 xmlr.setFeature("http://apache.org/xml/features/validation/schema",true);
 xmlr.setFeature("http://xml.org/sax/features/namespaces",true);
 // XMLファイルの検証を実行する
 xmlr.parse(xmlfile);
 } catch (SAXParseException e) {
 System.out.println(e.getMessage());
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 /**
 * XMLファイルのを読み込んで、文字列として扱う
 * @param xmlfile XMLファイルのフルパス
 */
 public static String xmlfileopen(String xmlfile){
 try {
 // ファイルをBufferedReaderで開く
 BufferedReader in = new BufferedReader(new FileReader(xmlfile));
 String s;
 String xmlstring = "";
 // ファイル内容を読みこんで文字列にする
 while ((s = in.readLine()) != null) {
 xmlstring = xmlstring + s;
 }
 in.close();
 return xmlstring;
 } catch (Exception e) {
 e.printStackTrace();
 return "aaa";
 }
 }
 /**
 * XMLファイルをPostgreSQLに挿入する
 * @param xmlstring XMLの文字列
 */
 public static void insert(String xmlstring){
 try {
 // PostgreSQLのドライバクラスをロードする
 Class.forName("org.postgresql.Driver");
 //データベースへの接続
 Connection con = DriverManager.getConnection
 ("jdbc:postgresql:testdb","postgres","**設定したパスワード**");
 // Insert文を作成する
 Statement stmt = con.createStatement();
 String sql = "INSERT INTO meibo(id,name,department,age,email,work_history) 
 VALUES(1031,'生田靖','IT事業統括部',45,'ikuta@abcd.com','"+ xmlstring + "');";
 // Insert文を実行
 int result = stmt.executeUpdate(sql);
 stmt.close();
 con.close();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
}

実行方法は以下の通りです。

C:\WINDOWS>cd C:\pgsqlxml
C:\pgsqlxml>javac validateandinsert.java

⇒フォルダに「validateandinsert.class」というファイルができる

C:\pgsqlxml>java validateandinsert record001.xml

⇒何もエラーが出なければ成功

testdb=# SELECT work_history FROM meibo;

⇒先ほど「2.5 XML Schemaによる検証を行ったXMLをPostgreSQLに格納する」で入れたデータと合わせて2件表示されればOK.

  1. validateandinsert.javaをPostgreSQLに格納したいXMLファイルと同じフォルダに置く
  2. validateandinsert.javaをテキストエディタで開いて、最後の方にある「// データベースへの接続」の引数を自分の環境に合わせる (通常psqlでPostgreSQLにアクセスするときと同じものを入力する)
  3. 新しくコマンド・プロンプトを開き、XMLファイルとJavaファイルのあるフォルダへ移動する
  4. javaファイルをjavacコマンドでコンパイルする
  5. 対象のXMLファイルを引数にしてプログラムを実行する
  6. PostgreSQLにpsqlで接続し、指定したXMLファイルがデータベースに格納されているかどうか確認する

 

                  work_history
-------------------------------------------------------------------------- \r
 <work-record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:/pgsqlxml/workhistory.xsd">\r
 <career>\r
 <period>\r
 <start>1970-04-01</start>\r
 <end>1980-03-31</end>\r
 </period>\r
 <content>製造業向け購買管理システムの開発 YOKOHAMA ヨコハマ ブルーアース AE-01F サマータイヤ 195/60R16 ブリヂストン BALMINUM T10 ホイールセット 4本 16 X 6.5 +48 5穴 114.3、大手流通業向け販売管理システム開発</content>\r
 <role>プログラマー</role>\r
 </career>\r
 <career>\r
 <period>\r
 <start>1980-04-01</start>\r
 <end>1985-03-31</end>\r
 </period>\r
 <content>金融機関向け社内Webシステム開発</content>\r
 <role>プロジェクトリーダー</role>\r
 </career>\r
 <career>\r
 <period>\r
 <start>1985-04-01</start>\r
 <end/>\r
 </period>\r
 <content>IT戦略部にて規格提案業務</content>\r
 <role>マネージャー</role>\r
 </career>\r
 </work-record>\r
 <work-record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="C:/pgsqlxml/workhistory.xsd"><career> <period>
<start>1970-04-01</start> <end>1980-03-31</end> </period> <content>製造業向け購買管理
システムの開発、大手流通業向け販売管理システム開発</content> <role>プログラマー</role></career>
<career> <period> <start>1980-04-01</start> <end>1985-03-31</end> </period> <content>
金融機関向け社内Webシステム開発</content> <role>プロジェクトリーダー</role></career><career>
<period><start>1985-04-01</start> <end/> </period> <content>IT戦略部にて規格提案業務
</content> <role>マネージャー</role></career></work-record>
(2 rows)


 
 
 

 
 
 
 
 
 
{yahoojp}jpprem01-zenjp40-wl-zd-24603