Как кэшировать файл dtd при разборе XML в Java - PullRequest
0 голосов
/ 27 июня 2018

Я анализирую несколько миллионов XML-файлов, отформатированных так:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE test-document PUBLIC "-//TEST//TEST DOC//EN" "https://somerandomurl.com/test.dtd">
<test-document>...</test-document>

Каждый раз, когда я анализирую файл, загружается один и тот же файл https://somerandomurl.com/test.dtd, который потребляет большую пропускную способность и кажется ненужным. Есть ли способ сохранить файл и сделать так, чтобы мой код перенаправил мою локальную копию? Я не могу редактировать XML-файлы, поэтому это должно быть в моем коде. Учитывая следующий код Java, что было бы разумным способом реализовать такую ​​вещь?

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(true);
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource("file.xml"));//My final document object.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Сначала прочитайте DTD в строковую переменную.

Тогда сделай

builder.setEntityResolver(
     (sysId, PubId) -> new InputSource(new StringReader(dtd)));

Или, если вы хотите быть более осторожным, попросите EntityResolver проверить, что systemId и / или publicId соответствуют ожиданиям, прежде чем возвращать содержимое dtd.

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

Также важно: создание экземпляра синтаксического анализатора XML требует значительных затрат (а создание экземпляра DocumentBuilderFactory еще больше). Убедитесь, что вы используете как фабрику, так и парсер.

0 голосов
/ 27 июня 2018

Если вы просто хотите кэшировать загруженные файлы DTD, лучше всего использовать каталоги XML. В частности, вы должны указать в правиле разрешения файл каталога, например:

<catalog
  Xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <system
    systemId="https://somerandomurl.com/test.dtd"
    uri="file://mydir/test.dtd"/>
</catalog>

что сущность с системным идентификатором https://somerandomurl.com/test.dtd разрешается как файл /mydir/test.dtd, который должен содержать загруженную локальную копию файла DTD, на который ссылается https: URL.

Ссылки

...