- PR -

DOMパーサ実装のENTITY展開の違いについて

1
投稿者投稿内容
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2002-03-17 12:09
DOM のサンプルをネットや書籍から集めているうちによくわからなくなってきましたので教えてください。

以下の URL に資料となりそうなものはまとめてみました。
http://www2s.biglobe.ne.jp/~katsum/etc/xmlq.html

質問1. 同 URL 中の表の「ルートノードの作成方法」は、具体的にはどういう違いがあるのでしょうか?どちらのコードをコンパイル & 実行するときも、CLASSPATH には IBM の XML4J 3.2.1 の jar ファイルを指定しています。

質問2. 同 URL 中の表の「ノードの解析結果」を見ていただくとわかるように、ENTITY の展開方法が違っています。これはオプションを指定すればどちらかの動作に意図的に変更できる任意性のあるものなのでしょうか?それとも DOM パーサ実装による固定的な違いなのでしょうか?
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2002-03-17 12:30
資料として必要かもしれないのでソースも UP しておきます。

http://www2s.biglobe.ne.jp/~katsum/etc/DomTree.html

ルートノードから再帰で回しているので、全ノードの走査が可能になってます。

DomTree クラスの METHOD 変数を 0 または 0 以外にすることにより、質問にあるようにルートノード作成までの動作が切り替わります。
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2002-03-18 21:17
その後調べてみましたが、METHOD==0 は JAXP を使った方法、METHOD==1 は XML4J を使った方法ということが分かりました。
JAXP は Sun、XML4J は IBMのサイト(英語)を直接当たって以下のようにより簡単に記述できることが分かりました。

// JAXP(Java API for XML Parsing)
if (METHOD == 0) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse("file:/" + XMLURL);
NodeRoot = document;
}
// XML4J
else {
parser = new DOMParser();
parser.parse(XMLURL);
document = parser.getDocument();
NodeRoot = document;
}

さらに調べたところ、XML4J はパーサーに org.apache.xerces.parsers.DOMParser を、JAXP は javax.xml.parsers.SAXParser を使っているみたいですね。ENTITY展開の違いはこれらパーサーの違いにあるみたいです。
といっても英語力に自信がないので、あくまで推測の範囲ですが。

間違った推測をしているようでしたら、どなたか修正していただけると嬉しいです。
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-03-25 09:53
引用:

さらに調べたところ、XML4J はパーサーに org.apache.xerces.parsers.DOMParser を、JAXP は javax.xml.parsers.SAXParser を使っているみたいですね。ENTITY展開の違いはこれらパーサーの違いにあるみたいです。



ここは、ちょっと違いますね。(確かに間違えやすいところではありますが…)
JAXPは、本来インタフェースを表す言葉で実装は含まれていません。
それまでは、メーカによってDOMやSAXのAPIのインタフェースが異なっていてソースの互換がない状況となっていました。そこでSunが統一のインタフェースとしてJAXPを定めて、各メーカがそのインタフェースを実装したパーサを作成しているというわけです。
XML4J(Xerces)は、その実装の一つに過ぎません。

例であげているXML4Jのほうは、JAXPが発表される前のメーカ独自のインタフェースで、この方法を採用すると別のメーカのパーサを使ったときにはソースの流用はできません。

下記の記事を参考にしてみてはどうでしょうか?
http://www.atmarkit.co.jp/fxml/tanpatsu/12javatool/javaxmltool01.html

[ メッセージ編集済み 編集者: ふうた 編集日時 2002-03-25 09:55 ]
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2002-03-27 21:41
> 以下の URL に資料となりそうなものはまとめてみました。
> http://www2s.biglobe.ne.jp/~katsum/etc/xmlq.html
>
> 質問2. 同 URL 中の表の「ノードの解析結果」を見ていただくとわかるように、ENTITY の展開方法が違っています。


その後調べたところ、XMLプロセッサの違いにより以下の結果となりました。

Cocoon 1.8:
→ JAXP方式・XML4J方式共に "方法2" の "ノードの解析結果"。

IBM 3.2.1, Apache 1.4.4, Apache 2.0.0:
→ JAXP方式では "方法1"、XML4J方式では "方法2" の "ノードの解析結果"。

内部的な動作はよくわかりませんが、こういう結果になりましたのでご報告します。
1

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