Java-xml文档如何使用XML目录加载DTD?

问题描述 投票:0回答:1

我想知道这一点,因此我可以将xsl转换应用于xml文档,而不会丢失某些实体,例如–

我如何告诉解析器(我不在乎的任何解析器)要使用哪个目录,然后执行xsl转换?,如何将新配置的解析器连接到转换工厂。

下面的代码表示我要在xml文件上执行的转换(工作正常)。我只想知道如何添加XML Catalog方法,以便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>

[如果有好心人帮我解决这个问题,我将非常感激。

先谢谢您。

安德烈斯

java xml xslt saxon dtd
1个回答
0
投票

最简单的方法是使用XMLReader创建自己的XML解析器(SAXTransformerFactory.newInstance())。然后使用CatalogResolver在解析器上设置XMLReader.setEntityResolver()。然后将XMLReader包裹在SAXSource中,并将其作为Source对象提供给Transformer.transform()

© www.soinside.com 2019 - 2024. All rights reserved.