- PR -

XSL変換時、XMLのDOCTYPE宣言を読み飛ばしたい

投稿者投稿内容
Kanji
会議室デビュー日: 2004/09/16
投稿数: 5
投稿日時: 2004-09-16 09:36
javax.xml.transform を利用してXMLを変換する際、
<!DOCTYPE Data SYSTEM data.dtd"> を読む際、DTDファイルに
フルパスを設定しないと、
java.io.FileNotFoundException: (指定されたファイルが見つかりません。)
となってしまうため、このDOCTYPE宣言を読み飛ばしたいのです。

XSL変換は以下の様に行っておりますが
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory
.newTransformer(new StreamSource(xslname));

Source source = new StreamSource(new InputStreamReader(inputStream));
Result result = new StreamResult(bos);
transformer.transform(source, result);

DOCTYPE宣言を読み飛ばしたり、できないものでしょうか?
ご存知の方おられましたら、よろしくお願い致します。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-09-16 09:55
るぱんです。

新しいDocを作成し、そこにRootNodeをCloneします。
そのDocに対してXSLをあてるってだめですか?
Kanji
会議室デビュー日: 2004/09/16
投稿数: 5
投稿日時: 2004-09-16 10:09
XMLのDOCTYPE宣言が不良と解釈されてしまい
パースエラーになるため、Cloneを作るところまで
進んでいない状態です。

パースする前に、XMLファイルから、DOCTYPE宣言を物理的に文字列削除
してというのもあったのですが、わざわざファイルIOを起こさずに
読み飛ばせたらと思っております。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-09-16 10:36
るぱんです。

パーサーが認識しない以上APIからは使えないと思います。
API使用の前提条件覆してるわけですから。

data.dtdをコピーして一時的に同階層におくか、
ダミーで作るしかないんじゃないですか?
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2004-09-16 13:11
えー、自分は全然使った事がないので、外してるかもしれませんが。
コード:
	transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");



コード:
	transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "フルパスのDTD");


を設定したらどうなります?
やっぱりファイルの方が優先されるのかな?
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-09-16 15:16
文書構造検証だけでなく
エンティティの解釈に関連する
ので、読み飛ばしや置き換えオプションなどは
無いと思います。PUBLICでなく、SYSTEM で普通では。
--------------------
0バイトの .dtd を置くとか、リンクがあれば
通ると思います。

[ メッセージ編集済み 編集者: MMX 編集日時 2004-09-16 15:31 ]
Kanji
会議室デビュー日: 2004/09/16
投稿数: 5
投稿日時: 2004-09-16 15:40
>solunaさん
 transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
 transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "フルパスのDTD");
 これは、出力時の設定の様です。

 パーサで読む場合にも、同じようなのがあれば良いのですが・・・・

>MMXさん
 おっしゃる様に、0バイトの .dtd を置くとか、リンクがあれば通ります。
 
実際に何が設定されても良いように、XML宣言すら読み飛ばしたいくらいの勢い
でしたが、これが限界と思いました。

皆様、ありがとうございます。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-09-16 16:04
Ant の場合は XMLカタログが使えるようです
XMLカタログ
http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/CoreTypes/xmlcatalog.html
--------------------------------------------------------
そのほか、簡単弁当でなく、peaser の材料から組み立てると
peaser.setFeature("http://xml.org/sax/features/validation" , false);
peaser.setFeature("http://apache/xml/features/novalidation/load-external-dtd" , false);
ができるかも。


[ メッセージ編集済み 編集者: MMX 編集日時 2004-09-16 17:59 ]

[ メッセージ編集済み 編集者: MMX 編集日時 2004-09-16 18:02 ]

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