【问题标题】:Default support for xinclude in Java 6?Java 6 中对 xinclude 的默认支持?
【发布时间】:2010-10-09 13:51:37
【问题描述】:

我在我的应用程序中看到我解析的 XML 文件中的 xinclude 在我的 Java XSLT 转换中不起作用。

但是,虽然我这样做了:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setXIncludeAware(true);

我没有专门将变压器工厂设置为 System.getProperty("javax.xml.transform.TransformerFactory") 返回“null”。

我的问题:默认 Java(1.6 或 6)是否支持 xinclude,或者我是否必须添加替代 XSLT 解析器,例如 Apache Xerces?

【问题讨论】:

    标签: java xml xslt xalan xinclude


    【解决方案1】:

    根据the spec,从 Java 1.5 (5) 开始就提供支持。我相信 XInclude 支持依赖于namespace awareness,出于向后兼容性的原因,默认情况下它是关闭的。

    public class XIncludeDemo {
    
        private static final String XML = "<?xml version=\"1.0\"?>\n"
                + "<data xmlns=\"foo\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">\n"
                + "<xi:include href=\"include.txt\" parse=\"text\"/>\n"
                + "</data>\n";
    
        private static final String INCLUDE = "Hello, World!";
    
        public static void main(String[] args) throws Exception {
            // data
            final InputStream xmlStream = new ByteArrayInputStream(XML
                    .getBytes("UTF-8"));
            final InputStream includeStream = new ByteArrayInputStream(INCLUDE
                    .getBytes("UTF-8"));
            // document parser
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setXIncludeAware(true);
            factory.setNamespaceAware(true);
            DocumentBuilder docBuilder = factory.newDocumentBuilder();
            if (!docBuilder.isXIncludeAware()) {
                throw new IllegalStateException();
            }
            docBuilder.setEntityResolver(new EntityResolver() {
                @Override
                public InputSource resolveEntity(String publicId, String systemId)
                        throws SAXException, IOException {
                    if (systemId.endsWith("include.txt")) {
                        return new InputSource(includeStream);
                    }
                    return null;
                }
            });
            Document doc = docBuilder.parse(xmlStream);
            // print result
            Source source = new DOMSource(doc);
            Result result = new StreamResult(System.out);
            TransformerFactory transformerFactory = TransformerFactory
                    .newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.transform(source, result);
        }
    
    }
    

    【讨论】:

    • 感谢您提供的信息。我需要一些时间来申请它,看看我是否可以接受。然而,你给我的信息正是我所需要的。
    • 谢谢,正是我想要的!
    猜你喜欢
    • 2016-08-08
    • 2011-12-05
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多