システム参照
CatalogResolver
オブジェクトを使用してローカル・リソースを検索します。
ローカル・リソースの検索
次の例では、CatalogResolver
オブジェクトを使用してローカル・リソースを検索する方法を示します。
次のXMLファイルを考えます:
<?xml version="1.0"?>
<!DOCTYPE catalogtest PUBLIC "-//OPENJDK//XML CATALOG DTD//1.0"
"http://openjdk.java.net/xml/catalog/dtd/example.dtd">
<catalogtest>
Test &example; entry
</catalogtest>
example.dtd
ファイルは、エンティティexample
を定義します:
<!ENTITY example "system">
ただし、XMLファイルにexample.dtd
ファイルへのURIが存在している必要はありません。一意の識別子を指定するのは、CatalogResolver
オブジェクトでローカル・リソースを検索するのが目的です。これを行うには、catalog.xml
というカタログ・エントリ・ファイルにローカル・リソースを参照するためのsystem
エントリを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system
systemId="http://openjdk.java.net/xml/catalog/dtd/example.dtd"
uri="example.dtd"/>
</catalog>
このカタログ・エントリ・ファイルとsystem
エントリを使用して行うことは、デフォルトのCatalogFeatures
オブジェクトを取得し、カタログ・エントリ・ファイルへのURIを設定してCatalogResolver
オブジェクトを作成するだけです:
CatalogResolver cr =
CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogUri);
catalogUri
は有効なURIである必要があります。たとえば:
URI.create("file:///users/auser/catalog/catalog.xml")
CatalogResolver
オブジェクトをJDK XMLリゾルバとして使用できるようになりました。次の例では、SAX EntityResolver
として使用されています。
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
XMLReader reader = factory.newSAXParser().getXMLReader();
reader.setEntityResolver(cr);
例ではシステム識別子に絶対URIが指定されていることに注意してください。これにより、リゾルバがカタログのsystem
エントリに完全に一致するsystemId
を検索することが容易になります。
XMLのsystem
識別子が相対である場合は、XMLプロセッサで指定のベースURIまたはソース・ファイルのURIを使用して絶対化する必要があるため、一致プロセスが複雑になります。その場合、システム・エントリのsystemId
が予期される絶対URIと一致する必要があります。より簡単に解決するには、次のようにsystemSuffix
エントリを使用します。
<systemSuffix systemIdSuffix="example.dtd" uri="example.dtd"/>
systemSuffix
エントリは、XMLソースのexample.dtd
で終わる任意の参照と一致し、それをuri
属性に指定されているとおりにローカルのexample.dtd
ファイルに解決します。systemId
が一意または正しい参照になるように、詳細を追加します。たとえば、systemIdSuffix
をxml/catalog/dtd/example.dtd
に設定するか、XMLソース・ファイルとsystemSuffix
エントリの両方でid
が一意に一致するように名前を変更します(例: my_example.dtd
)。
system
エントリのURIには、絶対URIまたは相対URIを指定できます。外部リソースの場所が固定されている場合は、絶対URIの方が一意性が保証されます。外部リソースがカタログ・エントリ・ファイルまたはアプリケーションに対して相対的な位置にある場合は、相対URIの方が効果的であり、アプリケーションのデプロイメントでインストール場所を意識する必要がありません。そのような相対URIは、ベースURIまたはカタログ・ファイルのURI (ベースURIが指定されていない場合)を使用して解決されます。前述の例では、example.dtd
がカタログ・ファイルと同じディレクトリに置かれていることを想定しています。