Java 6 中对 xinclude 的默认支持?

Posted

技术标签:

【中文标题】Java 6 中对 xinclude 的默认支持?【英文标题】:Default support for xinclude in Java 6? 【发布时间】: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?

【问题讨论】:

【参考方案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);
    


【讨论】:

感谢您提供的信息。我需要一些时间来申请它,看看我是否可以接受。然而,你给我的信息正是我所需要的。 谢谢,正是我想要的!

以上是关于Java 6 中对 xinclude 的默认支持?的主要内容,如果未能解决你的问题,请参考以下文章

Spring中对资源的读取支持

Drupal 6:在 tpl.php 中对多个值进行分组

JAVA8中对List<map<String,Object>>根据map某个value值进行排序,还支持中文排序,可以替代order by

Eclipse 中对 Grails Web 应用程序的调试支持不佳

Spring Boot干货系列:静态资源和拦截器处理

java中对除不尽的数怎么处理