- - PR -
DOCTYPE宣言がないXMLを外部DTDを使用してparseする方法
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-05-27 15:53
Xerces、またはJAXPを使用してDOCTYPE宣言がないXMLに対して外部DTDを使用してparseする方法はあるのでしょうか?
「外部 DTD DOCTYPE宣言がない XML」をキーにしてぐぐって見ましたが見つかりませんでした。 | ||||||||
|
投稿日時: 2004-05-27 18:45
Xerces2のAPIDOCを見ていると、こんなのがありました。
org.apache.xerces.parsers.DOMParser に setDTDSource というメソッドがあります。 http://xml.apache.org/xerces2-j/javadocs/xerces2/org/apache/xerces/parsers/DOMParser.html (正確には、setDTDSourceは、DOMParserのスーパークラスであるAbstractXMLDocumentParserのメソッドとなります。) ただし、これも結局、DOCTYPE宣言がないと意味のないメソッドかもしれません。 (ということで、はずしている可能性大です。。。) また、Xerces2 限定となります。 (ここで引っかかってしまうのかもしれませんが。) 私も気になるので、試してみて結果を報告いただければ幸いです。 [ メッセージ編集済み 編集者: ふうた 編集日時 2004-05-27 19:15 ] | ||||||||
|
投稿日時: 2004-05-27 21:23
EntityResolverが使えそうな気がします。
#試していませんが。 | ||||||||
|
投稿日時: 2004-05-27 22:26
申し訳ありません。
EntityResolverは、DOCTYPE宣言がないと意味がありませんでしたね。 次のような方法で妥当性検証することができました。 1.a.xmlをb.dtdで妥当性検証するものとします。 2.c.xmlを下記の内容で作成します。 <!DOCTYPE hoge [ <!ELEMENT hoge (a.xmlのルート要素)> <!ENTITY A_XML SYSTEM "a.xml"> <!ENTITY % B_DTD SYSTEM "b.dtd"> %B_DTD; ]> <hoge> &A_XML; </hoge> 3.c.xmlに対してparseする。 もっとスマートにできそうですが、これくらいしか思いつきませんでした。 | ||||||||
|
投稿日時: 2004-05-28 12:42
スミマセン、OracleのOC4Jというアプリケーションサーバ(バージョン不明)に含まれているXercesを使用しているので詳しいバージョンが判らなかったのですがsetDTDSource()というメソッドがないようなのでXerces2じゃないようです(残念 でも勉強がてらXerces2を使用して実現可能かやってみます。結果が出たらまた報告しますので暫くお待ち下さい。
やっぱり最終的にはこういう方法になってしまいますよね(^^;; とりあえずXerces2でやってみて結果を報告します。 | ||||||||
|
投稿日時: 2004-05-28 17:26
http://xml.apache.org/xerces2-j/javadocs/xni/org/apache/xerces/xni/parser/XMLDTDSource.html
DOMParser#setDTDSource(...)メソッドからJavaDocを辿ってみたのですがXMLDTDSourceはclassではなくinterfaceで、且つimplementsしたconcrete classも見つからなかったので今回は諦めました。 # 時間的な制限もあるので。 代りにXMLファイルとDTDファイルを結合して新しいXML Documentを生成してparseし直すサンプルプログラムを作成してみました。 以下サンプルソースです。
| ||||||||
1
