Использование каталога XML с библиотекой Java, которая использует JAXP для внутреннего использования - PullRequest
7 голосов
/ 18 июня 2010

Я использую библиотеку 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 ]

1 голос
/ 13 декабря 2011

К сожалению, установка 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
1 голос
/ 18 июня 2010

Я думаю, вам нужно системное свойство xml.catalog.files.

Взгляните на http://xml.apache.org/commons/components/resolver/resolver-article.html

Кстати, это был третий хит в поиске Google для jaxp catalog

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...