- PR -

DBにinsertするxmlデータについて

1
投稿者投稿内容
ぽむ
会議室デビュー日: 2002/02/20
投稿数: 2
投稿日時: 2002-02-20 15:30

はじめまして。xml歴2週間で思いっきり壁にブチあたってます。
DBにinsertするxmlデータ&DTDについて教えてください

<?xml version = '1.0' encoding = 'Shift_JIS'?>
<!DOCTYPE ROWSET SYSTEM "person.dtd">
<ROWSET>
<ROW>
<name>山田太郎</name>
<job>会社員</job>
<syokusyu>プログラマ</syokusyu>
</ROW>
</ROWSET>

でDTDが

<!ELEMENT name (#PCDATA)*>
<!ELEMENT job (#PCDATA)*>
<!ELEMENT syokusyu (#PCDATA)*>
<!ELEMENT ROW (SYO,SETSU,KOU)>
<!ATTLIST ROW num CDATA #REQUIRED >
<!ELEMENT ROWSET (ROW)*>

だとうまくいくのですが、ROW以下の階層をもう一段深くするとうまく行きません
<ROWSET>
<ROW>
<name>山田太郎</name>
<job>会社員
<syokusyu>プログラマ</syokusyu>
</job>
</ROW>
</ROWSET>

DTD↓
<!ELEMENT name (#PCDATA)*>
<!ELEMENT job (#PCDATA|syokusyu)*>
<!ELEMENT syokusyu (#PCDATA)*>
<!ELEMENT ROW (SYO,SETSU,KOU)>
<!ATTLIST ROW num CDATA #REQUIRED >
<!ELEMENT ROWSET (ROW)*>

とやっても

<ROWSET>
<ROW>
<name>山田太郎</name>
<job>会社員</job>
<gyomu>
<syokusyu>プログラマ</syokusyu>
</gyomu>
</ROW>
</ROWSET>

DTD↓
<!ELEMENT name (#PCDATA)*>
<!ELEMENT job (#PCDATA)*>
<!ELEMENT gyomu (syokusyu)*>
<!ATTLIST gyomu num CDATA #REQUIRED >
<!ELEMENT syokusyu (#PCDATA)*>
<!ELEMENT ROW (SYO,SETSU,KOU)>
<!ATTLIST ROW num CDATA #REQUIRED >
<!ELEMENT ROWSET (ROW)*>

と書いてもうまく行きません。

ちなみにテーブルはは

CREATE TABLE PERSON
(
name VARCHAR2,
job VARCHAR2,
gyomu VARCHAR2
)

です。
ROW以下の階層を深くするときの、記述方法を教えてください。
(そもそも、ROW以下の階層を深くすることは可能ですか?)

よろしくお願いいたします。
井上孝司
ぬし
会議室デビュー日: 2001/09/08
投稿数: 668
お住まい・勤務地: 東京都
投稿日時: 2002-02-20 16:18
井上です。

どちらのケースも、ROW 要素と、その下位の name 要素と job 要素、gyoumu 要素 (3 番目の場合) の親子関係を宣言する ELEMENT 宣言が抜けていませんか ?
複数の階層構造を持つ要素を宣言するときは、ルート要素から順番に

・下位の要素の存在を宣言
・宣言された下位要素のそれぞれについて、さらに下位要素があればそれを宣言、ない場合は #PCDATA を宣言

というサイクルを繰り返して、最終的にすべて #PCDATA で行き止まりになるまで続ける必要があります。
_________________
www.kojii.net
ぽむ
会議室デビュー日: 2002/02/20
投稿数: 2
投稿日時: 2002-02-20 17:00
早速の回答ありがとうございます。

>どちらのケースも、ROW 要素と、その下位の name 要素と job 要素、gyoumu 要素 (3 番目の場合) の親子関係を宣言する ELEMENT 宣言が抜けていませんか ?

<!ELEMENT ROW (SYO,SETSU,KOU)>の行のことですね。
すみません、正しくは
上の例の場合:<!ELEMENT ROW (name,job,syokusyu)>
下の例の場合:<!ELEMENT ROW (name,job,gyomu)>
ですね。
元は、違うデータでテストしていたのですが、こちらに投稿する際に上記のような例に変更して、その時の変更もれです。

その後調べてみて
http://www.atmarkit.co.jp/fxml/rensai/xdk05/xdk05.html
で<ROW>以下は1階層しか置けないことがわかりました。
XSLTを使用すればなんとかできるのかもしれないのですが、まだXSLTがよくわかっていないので、実現できるのかどうか闇の中というかんじです。

回答ありがとうございました。心から感謝!です。
1

スキルアップ/キャリアアップ(JOB@IT)