- PR -

DTDを解析してタグを追加

1
投稿者投稿内容
まる
会議室デビュー日: 2002/04/11
投稿数: 10
投稿日時: 2002-04-11 11:24
初めまして。

現在 VC++6.0とMSXML4.0で開発を行っています。

DOMに対してタグを追加する時に
DTDを解析してタグを追加したいのですが

例えばDTD(dtd_test.dtd)の内容が

<!ELEMENT root (tag1?,tag2?,tag3?,tag4?,tag5?) >

<!ELEMENT tag1 (#PCDATA) >
<!ELEMENT tag2 (#PCDATA) >
<!ELEMENT tag3 (#PCDATA) >
<!ELEMENT tag4 (#PCDATA) >
<!ELEMENT tag5 (#PCDATA) >

だった場合で

DOMツリーの内容は

<!DOCTYPE 〜中略〜 "dtd_test.dtd">
<root>
<tag1>hogehoge</tag1>
<tag2>hogehoge</tag2>
<tag5>hogehoge</tag5>
</root>

の時に新しいタグ<tag3>を挿入する時に
DTDを解析して<tag3>を<tag2>に次に
挿入しようとしています。

そこでDTDを解析する為に

pDoc->get_doctype(&pType);

でドキュメントタイプを取得して

pType->get_firstChild(&pChild);

としたのですが

子ノードなしで帰って来ます。
ちなみにDTDに<ENTITY>を定義している場合は
get_firstChildを行った場合はENTITYが取得出来ました。

MSXMLではDTDのELEMENTを取得する方法はないのでしょうか?

DTDの解析方法について何かあれば、ご教授願います。
よねくら
常連さん
会議室デビュー日: 2002/04/24
投稿数: 29
投稿日時: 2002-04-24 18:17
はじめまして。

DOM Level 2がサポートされているプロセッサであれば、DocumentTypeオブジェクトのinternalSubsetアトリビュートで「内部」サブセットの全体のイメージを取得できますが、残念ながらMSXML4では未サポートです。

現実的な方法としては、SAXを利用することだと思います。以下の拡張イベントハンドラを使用することで、DTDの内容を取得できます。

LexicalHandler
DeclHandler

しかしながら、例えば要素型宣言の情報は、elementDeclイベントメソッドのパラメータとして取得できますが、内容モデルの情報は定義したとおりの単純な文字列です。プログラムでその内容を解析するのは面倒です。
よねくら
常連さん
会議室デビュー日: 2002/04/24
投稿数: 29
投稿日時: 2002-04-24 18:30
蛇足(その1)ですが。

EntityノードやNotationノードとDocumentTypeノードの間には親子の関係はありません。
なので、

> pType->get_firstChild(&pChild);

の記述では、Entityノードなどを取得することは、「本来」できません。MSXMLが特別なのです。
EntityノードやNotationノードの取得は、DocumentTypeノードのentitiesアトリビュートやnotationsアトリビュートでおこないます。

蛇足(その2)です。

W3Cが現在標準化をすすめている DOM Level 3では、DTDなどのスキーマの宣言内容を取得できるメソッドが追加されるようです。
まる
会議室デビュー日: 2002/04/11
投稿数: 10
投稿日時: 2002-04-24 23:05
ご返答ありがとうございます。

>内容モデルの情報は定義したとおりの単純な文字列です。プログラムでその内容を解析するの は面倒です。

SAXを使用しての文字列解析はちょっと厳しそうですね。
とりあえず今はタグの順番を意識しながら
AppendChildしています。

>W3Cが現在標準化をすすめている DOM Level 3では、DTDなどのスキーマの宣言内容を取得で きるメソッドが追加されるようです

情報ありがとうございます。
詳しい情報を調べて見ます。

リリースまでにはまだ期間であるので、それまでに
MSXMLがLevel2のサポートをしてくれればよいのですが・・


ありがとうございました。
1

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