- - PR -
DTDを解析してタグを追加
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 18:17
はじめまして。
DOM Level 2がサポートされているプロセッサであれば、DocumentTypeオブジェクトのinternalSubsetアトリビュートで「内部」サブセットの全体のイメージを取得できますが、残念ながらMSXML4では未サポートです。 現実的な方法としては、SAXを利用することだと思います。以下の拡張イベントハンドラを使用することで、DTDの内容を取得できます。 LexicalHandler DeclHandler しかしながら、例えば要素型宣言の情報は、elementDeclイベントメソッドのパラメータとして取得できますが、内容モデルの情報は定義したとおりの単純な文字列です。プログラムでその内容を解析するのは面倒です。 |
|
投稿日時: 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-24 23:05
ご返答ありがとうございます。
>内容モデルの情報は定義したとおりの単純な文字列です。プログラムでその内容を解析するの は面倒です。 SAXを使用しての文字列解析はちょっと厳しそうですね。 とりあえず今はタグの順番を意識しながら AppendChildしています。 >W3Cが現在標準化をすすめている DOM Level 3では、DTDなどのスキーマの宣言内容を取得で きるメソッドが追加されるようです 情報ありがとうございます。 詳しい情報を調べて見ます。 リリースまでにはまだ期間であるので、それまでに MSXMLがLevel2のサポートをしてくれればよいのですが・・ ありがとうございました。 |
1