Каталог XML - XML catalog

XML документы обычно относятся к внешним объектам, например к общедоступному и / или системному идентификатору для Определение типа документа. Эти внешние отношения выражаются с помощью URI, обычно в виде URL.

Однако абсолютные URL-адреса работают только тогда, когда сеть может их достичь. Использование удаленных ресурсов делает обработку XML уязвимой как для плановых, так и для незапланированных простоев сети.

Относительные URL-адреса полезны только в том контексте, в котором они были изначально созданы. Например, URL-адрес "../../xml/dtd/docbookx.xml" обычно будет полезен только в очень ограниченных обстоятельствах.

Один из способов избежать этих проблем - использовать преобразователь сущностей (стандартная часть SAX ) или URI Resolver (стандартная часть JAXP ). Сопоставитель может проверять URI запрашиваемых ресурсов и определять, как лучше всего удовлетворить эти запросы. В Каталог XML - документ, описывающий соответствие между ссылками на внешние сущности и локально кэшированными эквивалентами.

Пример Catalog.xml

В следующем простом каталоге показано, как, например, можно предоставить локально кэшированные DTD для инструмента проверки страницы XHTML.

   <?xml version="1.0"?>  Каталог     PUBLIC "- // OASIS // XML-каталог разрешения сущностей DTD V1.0 // EN"           "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">  <каталог xmlns ="урна: оазис: имена: tc: entity: xmlns: xml: каталог"           предпочитаю ="общественный">    <общественный publicId ="- // W3C // DTD XHTML 1.0 Strict // EN"            uri ="dtd / xhtml1 / xhtml1-strict.dtd"/>    <общественный publicId ="- // W3C // DTD XHTML 1.0 Transitional // EN"            uri ="dtd / xhtml1 / xhtml1-transitional.dtd"/>    <общественный publicId ="- // W3C // DTD XHTML 1.1 // EN"            uri ="dtd / xhtml11 / xhtml11-flat.dtd"/>  </catalog>

Этот каталог позволяет разрешить - // W3C // DTD XHTML 1.0 Strict // EN на локальный URI dtd / xhtml1 / xhtml1-strict.dtd. Точно так же он предоставляет локальные URI для двух других общедоступных идентификаторов.

Обратите внимание, что приведенный выше документ включает DOCTYPE - это может привести к тому, что синтаксический анализатор попытается получить доступ к URL-адресу системного идентификатора для DOCTYPE (т.е. http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd) до того, как преобразователь каталогов полностью заработает, что, вероятно, нежелательно. Чтобы предотвратить это, просто удалите объявление DOCTYPE.

В следующем примере показано это, а также показан эквивалент <system/> декларации как альтернатива <public/> декларации.

  <?xml version="1.0"?>  <каталог xmlns ="урна: оазис: имена: tc: entity: xmlns: xml: каталог">    <система systemId ="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"            uri ="dtd / xhtml1 / xhtml1-strict.dtd"/>    <система systemId ="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"            uri ="dtd / xhtml1 / xhtml1-transitional.dtd"/>    <система systemId ="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"            uri ="dtd / xhtml11 / xhtml11-flat.dtd"/>  </catalog>

Использование каталога - пример Java SAX

Преобразователи каталогов доступны для различных языков программирования. В следующем примере показано, как в Java SAX парсер может быть создан для анализа некоторого источника ввода, в котором org.apache.xml.resolver.tools.CatalogResolver используется для преобразования внешних сущностей в локально кэшированные экземпляры. Этот преобразователь происходит от Apache Xerces но теперь включен в среду выполнения Sun Java.

Необходимо создать SAXParser стандартным способом с помощью фабрик. Преобразователь сущностей чтения XML должен быть установлен по умолчанию или настраиваемый.

  окончательный SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();  окончательный XMLReader читатель = saxParser.getXMLReader();  окончательный ContentHandler обработчик = ...;  окончательный InputSource Вход = ...;  читатель.setEntityResolver( новый Каталог() );  читатель.setContentHandler( обработчик );  читатель.разбирать( Вход );

Важно позвонить в разбирать метод на ридере, нет на парсере SAX.

Рекомендации