システム参照

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が一意または正しい参照になるように、詳細を追加します。たとえば、systemIdSuffixxml/catalog/dtd/example.dtdに設定するか、XMLソース・ファイルとsystemSuffixエントリの両方でidが一意に一致するように名前を変更します(例: my_example.dtd)。

systemエントリのURIには、絶対URIまたは相対URIを指定できます。外部リソースの場所が固定されている場合は、絶対URIの方が一意性が保証されます。外部リソースがカタログ・エントリ・ファイルまたはアプリケーションに対して相対的な位置にある場合は、相対URIの方が効果的であり、アプリケーションのデプロイメントでインストール場所を意識する必要がありません。そのような相対URIは、ベースURIまたはカタログ・ファイルのURI (ベースURIが指定されていない場合)を使用して解決されます。前述の例では、example.dtdがカタログ・ファイルと同じディレクトリに置かれていることを想定しています。