Default support for xinclude in Java 6?

后端 未结 1 1921
借酒劲吻你
借酒劲吻你 2020-12-03 12:26

I see in my application that xinclude inside my parsed XML file does not work within my Java XSLT conversion.

However, although I do:

DocumentBuilder         


        
相关标签:
1条回答
  • 2020-12-03 13:07

    According to the spec, support has been there since Java 1.5 (5). I believe XInclude support relies on namespace awareness, which is turned off by default for backwards compatibility reasons.

    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);
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题