- - PR -
DOMパーサ実装のENTITY展開の違いについて
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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 パーサ実装による固定的な違いなのでしょうか? | ||||
|
投稿日時: 2002-03-17 12:30
資料として必要かもしれないのでソースも UP しておきます。
http://www2s.biglobe.ne.jp/~katsum/etc/DomTree.html ルートノードから再帰で回しているので、全ノードの走査が可能になってます。 DomTree クラスの METHOD 変数を 0 または 0 以外にすることにより、質問にあるようにルートノード作成までの動作が切り替わります。 | ||||
|
投稿日時: 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展開の違いはこれらパーサーの違いにあるみたいです。 といっても英語力に自信がないので、あくまで推測の範囲ですが。 間違った推測をしているようでしたら、どなたか修正していただけると嬉しいです。 | ||||
|
投稿日時: 2002-03-25 09:53
ここは、ちょっと違いますね。(確かに間違えやすいところではありますが…) 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 ] | ||||
|
投稿日時: 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
