2012-05-21 4 views
5

Я использую woodstox для реализации анализатора StAX для файлов XML. Предположим, что у меня есть действительный файл XML с соответствующим DTD где-то в общем каталоге в моей файловой системе.Как загрузить относительную систему DTD в парсер StAX?

/path/to/test.xml 
/path/to/test.dtd 

Ссылки XML на его DTD, используя относительную декларацию идентификатора системы следующим образом:

<!DOCTYPE test SYSTEM "test.dtd"> 

С точки зрения проверки, все, кажется, хорошо для меня. (Является ли это? Xmllint не жалуется.) Однако, когда я пытаюсь проанализировать файл с помощью кода ниже, woodstox выбрасывает java.io.FileNotFoundException, поскольку он не может найти относительный DTD-файл. Мне кажется, что реализация пытается получить доступ к DTD-файлу относительно рабочего каталога, а не к объекту XML-файла.

import java.io.FileInputStream; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamReader; 

public class Test { 

    public static void main(String[] args) throws Exception { 

     FileInputStream fileInputStream = new FileInputStream(args[0]); 
     XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xmlInputFactory.createXMLStreamReader(fileInputStream); 

     while(xsr.hasNext()) { 
      if(xsr.next() == XMLStreamConstants.DTD) { 
       System.err.println(xsr.getText()); 
      } 
     } 
    } 
} 
  1. Является ли это намеренно?
  2. Есть ли удобный способ убедить парсер STAX загрузить DTD относительно данного XML-файла вместо относительного рабочего каталога?

ответ

3

Вы будете нуждаться, чтобы обеспечить собственную реализацию интерфейса XMLResolver (он был известен как EntityResolver в SAX мире), чтобы помочь анализатор найти DTD. У XMLInputFactory есть метод setXMLResolver(), который сделает это за вас.

Некоторые больше информации по этой теме:

Это также хорошая идея, чтобы посмотреть под капотом, чтобы понять, что именно происходит, когда парсеров необходимо решить СИСТЕМУ URI. Например, Woodstox имеет an internal (and a default) implementation of the XMLResolver (а также a proxy between the SAX's EntityResolver and a StAX XMLResolver). Посмотрите, что он делает с вашим DTD «filename», и вы поймете, почему он работает так, как есть.

 Смежные вопросы

  • Нет связанных вопросов^_^