Использование каталога XML с библиотекой Java, которая использует JAXP для внутреннего использования
Я использую библиотеку xml rpc веб-службы Apache для отправки запросов в службу rpc. Где-то в этом процессе находится XML-документ со ссылкой DTD на http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd, который библиотека пытается загрузить при анализе XML. Эта загрузка завершается неудачно с кодом состояния 503, потому что w3c блокирует повторные загрузки этого в основном статического документа с клиентов Java.
Решение - каталоги XML для локального кэширования DTD. Однако, хотя я могу найти примеры установки EntityHandler для экземпляра JAXP SAXParser напрямую, чтобы включить поддержку синтаксического анализатора каталога, на самом деле у меня нет доступа к базовому анализатору здесь. Он просто используется библиотекой xml rpc. Можно ли каким-то образом установить глобальное свойство или что-то, что скажет JAXP использовать каталоги XML?
2 ответа
К сожалению, установка xml.catalog.files НЕ оказывает никакого влияния на фабрику синтаксического анализатора. В идеале, конечно, это должно быть, но единственный способ использовать преобразователь - это каким-то образом добавить метод, который делегирует разрешение преобразователю каталога в обработчике, который использует анализатор SAX.
Если вы уже используете парсер SAX, это довольно просто:
final CatalogResolver catalogResolver = new CatalogResolver();
DefaultHandler handler = new DefaultHandler() {
public InputSource resolveEntity (String publicId, String systemId) {
return catalogResolver.resolveEntity(publicId, systemId);
}
public void startElement(String namespaceURI, String lname, String qname,
Attributes attrs) {
// the stuff you'd normally do
}
...
};
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser saxParser = factory.newSAXParser();
String url = args.length == 0 ? "http://horstmann.com/index.html" : args[0];
saxParser.parse(new URL(url).openStream(), handler);
В противном случае вам необходимо выяснить, можете ли вы предоставить собственный преобразователь сущностей. С javax.xml.parsers.DocumentBuilder вы можете. С объектом scala.xml.XML вы не можете, но можете использовать уловку:
val res = new com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver
val loader = new factory.XMLLoader[Elem] {
override def adapter = new parsing.NoBindingFactoryAdapter() {
override def resolveEntity(publicId: String, systemId: String) = {
res.resolveEntity(publicId, systemId)
}
}
}
val doc = loader.load(new URL("http://horstmann.com/index.html"))enter code here
Я думаю, что вы хотите системное свойство xml.catalog.files
,
Посмотрите на http://xml.apache.org/commons/components/resolver/resolver-article.html
Кстати, это был третий хит в поиске Google для jaxp catalog