Java - Как документ xml загружает DTD, используя каталоги XML? - PullRequest
0 голосов
/ 06 марта 2020

Я хочу знать это, чтобы я мог применить преобразования xsl к документу xml, не теряя при этом некоторые сущности, такие как –

Как мне сказать синтаксическому анализатору (любому парсеру, который меня не интересует), какой каталог использовать и затем выполнить преобразования xsl ?, Как подключить новый сконфигурированный синтаксический анализатор к фабрике преобразований.

Приведенный ниже код представляет преобразования, которые я хочу выполнить для файла xml (он работает нормально). Я просто хочу знать, как я могу добавить каталог XML, чтобы xml -документ корректно загружал свое DTD и продолжал выполнять шаги преобразования xsl.

        try {
        SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactory.newInstance();


        Templates step1Template = stf.newTemplates(new StreamSource(
                this.getClass().getResourceAsStream("xsltransformation_step1.xsl")
        ));

        Templates step2Template = stf.newTemplates(new StreamSource(
                this.getClass().getResourceAsStream("xsltransformation_step2.xsl")
        ));

       Templates step3Template = stf.newTemplates(new StreamSource(
               this.getClass().getResourceAsStream("xsltransformation_step3.xsl")
        ));

        TransformerHandler th1 = stf.newTransformerHandler(step1Template);
        TransformerHandler th2 = stf.newTransformerHandler(step2Template);
        TransformerHandler th3 = stf.newTransformerHandler(step3Template);

        StreamSource xmlStreamSource = new StreamSource(new File(xmlInputFile));

        StreamResult outputStreamSource1 = new StreamResult(new File (outputNewFile1));
        StreamResult outputStreamSource2 = new StreamResult(new File (outputNewFile2));

        th1.setResult(new SAXResult(th2));
        th2.setResult(new SAXResult(th3));
        th3.setResult(outputStreamSource1);

        Transformer t = stf.newTransformer();
        t.transform(xmlStreamSource, new SAXResult(th1));


    }catch (TransformerException e){
        e.printStackTrace();
        return false;
    }

Это пример сущностей, содержащих xmlInputFile

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE manual PUBLIC '-//docufy//Docufy Standard DTD 20080125//EN' '/system/cosimago/dtd/manual.dtd'>
<chapter>
  <title>LEDs &#8222;5 &ndash; 8&#8220; am CPU-Board pr&#252;fen</title>
  <body>
   <!-- just content -->
  </body>
</chapter>

Пожалуйста, я был бы очень благодарен, если бы какая-то хорошая душа помогла мне с этим.

Заранее спасибо.

Андрес

1 Ответ

0 голосов
/ 06 марта 2020

Проще всего создать свой собственный XML парсер (XMLReader), используя SAXTransformerFactory.newInstance(). Затем установите CatalogResolver на анализаторе, используя XMLReader.setEntityResolver(). Затем оберните XMLReader в SAXSource и передайте его как Source объект в Transformer.transform().

. С помощью Saxon также возможно косвенно предоставить преобразователь сущностей через свойство конфигурации, но это гораздо более запутанный и необходим, только если вы не можете сами управлять созданием и настройкой XMLReader.

...