【问题标题】:How can I set the entity resolver?如何设置实体解析器?
【发布时间】:2019-03-24 10:20:33
【问题描述】:

我正在尝试动态设置 dtd 路径。当我使用 EntityResolver 类时,它适用于 org.xml.sax.XMLReader。但我不知道如何为 SAXSource 设置 EntityResolver。如何更正以下代码?

import java.util.logging.Logger;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class XMLProcessor  {

       public void transform(String xmlf, String xslf) throws TransformerConfigurationException, TransformerException, org.xml.sax.SAXException, IOException{


        Transformer transformer;
        TransformerFactory factory = TransformerFactory.newInstance();

         StreamSource stylesheet = new StreamSource(xslf);

         //Source source = StreamSource(xmlf);
         SAXSource source = new SAXSource(new InputSource(xmlf));
         org.xml.sax.XMLReader reader = XMLReaderFactory.createXMLReader();

         EntityResolver ent = new EntityResolver() {

            @Override
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {

                System.out.println(publicId);
                System.out.println(systemId);

                if(publicId.equals("-//OASIS//DTD DITA BookMap//EN")){
                    return new InputSource("file:///D:/dtd/bookmap/dtd/bookmap.dtd");
                }

                if(systemId.equals("file:///D:/doc/maps/bookmap.dtd")){
                    return new InputSource("file:////dtd/bookmap/dtd/bookmap.dtd");
                }
                return null;
                }
            };
        // sour.setPublicId("file:///D:/dtd/bookmap/dtd/bookmap.dtd");



            reader.setEntityResolver(ent);
            reader.parse(new InputSource(xmlf));
         //StreamSource sourcedoc = new StreamSource(xmlf);
         transformer = factory.newTransformer(stylesheet);

        try {
            transformer.transform(source, new StreamResult(new FileWriter("out/result.xml")));
        } catch (IOException ex) {
            Logger.getLogger(XMLProcessor.class.getName()).log(Level.SEVERE, null, ex);
        }

    }




}

实体解析似乎适用于这一行:

 reader.parse(new InputSource(xmlf));

但以下行失败:

transformer.transform(source, new StreamResult(new FileWriter("out/result.xml")));

我得到这个错误:

doc\maps\bookmap.dtd(系统找不到指定的文件)

【问题讨论】:

    标签: java xslt sax entityresolver


    【解决方案1】:

    有一个构造函数

    public SAXSource(XMLReader reader,
                     InputSource inputSource)
    

    https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/sax/SAXSource.html#SAXSource-org.xml.sax.XMLReader-org.xml.sax.InputSource-

    所以你应该可以使用

         org.xml.sax.XMLReader reader = XMLReaderFactory.createXMLReader();
    
         EntityResolver ent = new EntityResolver() {
    
            @Override
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
    
                System.out.println(publicId);
                System.out.println(systemId);
    
                if(publicId.equals("-//OASIS//DTD DITA BookMap//EN")){
                    return new InputSource("file:///D:/dtd/bookmap/dtd/bookmap.dtd");
                }
    
                if(systemId.equals("file:///D:/doc/maps/bookmap.dtd")){
                    return new InputSource("file:////dtd/bookmap/dtd/bookmap.dtd");
                }
                return null;
                }
            };
    
    
    
            reader.setEntityResolver(ent);
    
            SAXSource source = new SAXSource(reader, new InputSource(xmlf));
    

    【讨论】:

    • 感谢您帮助我。有用。我这里有一个小问题。我将 xsl 应用于图书地图并合并多个主题(xml 文件)。此代码解析图书地图的实体。但是,处理器无法找到单个 xml 文件的 dtd 文件。如何为所有 dtd 文件设置一个位置?提前致谢。
    • @Antony,考虑将这个问题作为一个新问题提出,用最少但完整的不同文件样本来演示问题,以及准确的错误消息。
    • 当然。我在这里发布了另一个问题:stackoverflow.com/questions/55325569/…
    猜你喜欢
    • 2010-09-23
    • 2015-11-19
    • 2013-11-24
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多