Предоставление файла DTD для анализатора StAX - PullRequest
2 голосов
/ 03 апреля 2012

Я использую StAX для обработки файла XML.Документ имеет ссылку DOCTYPE на файл dtd

<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">

Я получаю XML из Интернета (я его транслирую), а файл DTD находится рядом с XML (но- как xml - на удаленной машине).

Теперь DTD содержит некоторые объявления сущностей, которые используются в XML, т. е.

<!ENTITY Ntilde "&#209;" ><!-- capital N, tilde -->

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

Q: как я могу предоставить файл DTD анализатору (было бы лучше, если бы он могбудь потоком из интернета).

1 Ответ

2 голосов
/ 03 апреля 2012

С Woodstox все в порядке. Вот мой фрагмент (с использованием ClasspathResource класса из Spring):

XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setXMLResolver(new XMLResolver() {
  @Override
  public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException {
    try {
      if ("onlineDoc.dtd".equals(systemID))
        return new ClassPathResource(systemID, getClass()).getInputStream();
    }
    catch (IOException e) {
      return null;
    }
    return null;
  }
});
XMLStreamReader reader = xif.createXMLStreamReader(new ClassPathResource("a.xml", this.getClass()).getInputStream());
while (reader.hasNext()) {
  reader.next();
  if (reader.isCharacters())
    log.info(new String(reader.getTextCharacters()));
}

это работает и для:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">
<onlineDoc>
    <test>a &Ntilde; b</test>
</onlineDoc>

печать:

a Ñ b

в Maven используется:

<dependency>
   <groupId>org.codehaus.woodstox</groupId>
   <artifactId>woodstox-core-asl</artifactId>
   <version>4.1.2</version>
</dependency>
...