This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these messages)
|
XML文書は通常、外部エンティティを参照します。例えば、文書型定義(DTD)のパブリックIDやシステムIDなどです。これらの外部関係は、URI(通常はURL)を用いて表現されます。
ただし、絶対URLはネットワークがアクセスできる場合にのみ機能します。リモートリソースに依存すると、XML処理は計画的および計画外のネットワークダウンタイムの影響を受けやすくなります。
相対URLは、最初に作成されたコンテキスト内でのみ有効です。例えば、「../../xml/dtd/docbookx.xml」というURLは、通常、非常に限られた状況でのみ有効です。
これらの問題を回避する一つの方法は、エンティティリゾルバ( SAXの標準機能)またはURIリゾルバ(JAXPの標準機能)を使用することです。リゾルバは、要求されたリソースのURIを調べ、それらの要求を満たす最適な方法を決定します。XMLカタログは、外部エンティティ参照とローカルにキャッシュされた同等の参照との間のマッピングを記述した文書です。[1]
Catalog.xml の例
次の簡単なカタログは、たとえば、 XHTMLページ検証ツールにローカルにキャッシュされた DTD を提供する方法を示しています。
<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS//DTD エンティティ解決 XML カタログ V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns= "urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer= "public" >
<public publicId= "-//W3C//DTD XHTML 1.0 Strict//EN" uri= "dtd/xhtml1/xhtml1-strict.dtd" />
<public publicId= "-//W3C//DTD XHTML 1.0 Transitional//EN" uri= "dtd/xhtml1/xhtml1-transitional.dtd" />
<public publicId= "-//W3C//DTD XHTML 1.1//EN" uri= "dtd/xhtml11/xhtml11-flat.dtd" />
</カタログ>
-//W3C//DTD XHTML 1.0 Strict//ENこのカタログにより、ローカル URI への解決が可能になりますdtd/xhtml1/xhtml1-strict.dtd。同様に、他の2つのパブリックIDのローカル URI も提供します。
上記の文書にはDOCTYPEが含まれていることに注意してください。これによりhttp://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd、カタログリゾルバが完全に機能する前に、パーサーがDOCTYPEのシステムID URL(つまり )にアクセスしようとする可能性があります。これはおそらく望ましくありません。これを防ぐには、DOCTYPE宣言を削除するだけです。
次の例はこれを示しており、宣言<system/>の代替として同等の宣言も示しています<public/>。
<?xml version="1.0"?>
<catalog xmlns= "urn:oasis:names:tc:entity:xmlns:xml:catalog" >
<システムシステムID = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" uri = "dtd/xhtml1/xhtml1-strict.dtd" />
<システムシステムID = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" uri = "dtd/xhtml1/xhtml1-transitional.dtd" />
<システムシステムID = "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" uri = "dtd/xhtml11/xhtml11-flat.dtd" />
</カタログ>
カタログの使用 – Java SAXの例
カタログリゾルバは様々なプログラミング言語で利用可能です。以下の例は、JavaにおいてSAXパーサを作成し、入力ソースを解析する方法を示しています。このSAXパーサでは、org.apache.xml.resolver.tools.CatalogResolver外部エンティティをローカルにキャッシュされたインスタンスに解決するためにSAXが使用されます。このリゾルバはApache Xercesに由来しますが、現在はSun Javaランタイムに含まれています。
ファクトリを使用して標準的な方法でを作成する必要がありますSAXParser。XMLリーダーのエンティティリゾルバは、デフォルトまたはカスタムのものに設定する必要があります。
最終的なSAXParser saxParser = SAXParserFactory.newInstance (). newSAXParser ( ) ;最終的なXMLReader reader = saxParser.getXMLReader ( ) ;
最終的なContentHandlerハンドラー= ...;最終的なInputSource入力= ...;
reader.setEntityResolver ( new CatalogResolver ( ) ) ; reader.setContentHandler ( handler ) ; reader.parse ( input ) ;
SAX パーサーで
はなくparse、リーダーでメソッドを呼び出すことが重要です。
参考文献
- ^ Walsh, Norman (2005年10月7日). 「XMLカタログOASIS標準V1.1」(PDF) . OASIS (pdf) . 2023年11月4日閲覧。
- XMLカタログ。OASIS標準、バージョン1.1。2005年10月7日。
- XMLエンティティおよびURIリゾルバ、Sun
- SourceForge の XML カタログ マネージャー プロジェクト