XML-каталог
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
XML- документы обычно ссылаются на внешние объекты, например общедоступный и/или системный идентификатор для определения типа документа . Эти внешние связи выражаются с помощью URI, обычно в виде URL-адресов.
Однако абсолютные URL-адреса работают только тогда, когда сеть может их достичь. Использование удаленных ресурсов делает обработку XML уязвимой как к плановым, так и к незапланированным простоям сети.
Относительные URL-адреса полезны только в том контексте, в котором они были изначально созданы. Например, URL-адрес «../../xml/dtd/docbookx.xml» обычно будет полезен только в очень ограниченных случаях.
Один из способов избежать этих проблем — использовать преобразователь сущностей (стандартная часть SAX ) или преобразователь URI (стандартная часть JAXP ). Резолвер может проверять URI запрашиваемых ресурсов и определять, как лучше всего удовлетворить эти запросы. Каталог XML — это документ, описывающий сопоставление между ссылками на внешние сущности и локально кэшированными эквивалентами. [ 1 ]
Пример каталога.xml
[ редактировать ]В следующем простом каталоге показано, как можно предоставить локально кэшированные DTD, например, для инструмента проверки страницы XHTML.
<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog 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"/>
</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"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
uri="dtd/xhtml1/xhtml1-strict.dtd"/>
<system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
uri="dtd/xhtml1/xhtml1-transitional.dtd"/>
<system 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 должно быть установлено значение по умолчанию или пользовательское значение.
final SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
final XMLReader reader = saxParser.getXMLReader();
final ContentHandler handler = ...;
final InputSource input = ...;
reader.setEntityResolver( new CatalogResolver() );
reader.setContentHandler( handler );
reader.parse( input );
Важно позвонить в parse
метод на считывателе, а не на анализаторе SAX.
Ссылки
[ редактировать ]- ^ Уолш, Норман (7 октября 2005 г.). «XML-каталоги OASIS Standard V1.1» (PDF) . ОАЗИС (pdf) . Проверено 4 ноября 2023 г.