9 Stimmen

Standardunterstützung für xinclude in Java 6?

Ich sehe in meiner Anwendung, dass xinclude innerhalb meiner geparsten XML-Datei nicht innerhalb meiner Java XSLT-Konvertierung funktioniert.

Allerdings, obwohl ich es tue:

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

Ich setze die Transformatorenfabrik nicht speziell als System.getProperty("javax.xml.transform.TransformerFactory") gibt "null" zurück.

Meine Frage: Unterstützt das Standard-Java (1.6 oder 6) xinclude oder muss ich einen alternativen XSLT-Parser wie Apache Xerces hinzufügen?

14voto

McDowell Punkte 105255

Según die Spezifikation Unterstützung gibt es seit Java 1.5 (5). Ich glaube, die Unterstützung von XInclude beruht auf Namensraumbewusstsein die aus Gründen der Abwärtskompatibilität standardmäßig deaktiviert ist.

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);
    }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X