Hi everyone,
I'm using JAXP 1.3 (by default since I'm using Java 1.5), using Xerces
as my parser. I'm loading a Document that contains XInclude tags, which
I'd like to be resolved as the document is loaded. I can't get this to
happen though. When I've loaded the document it still contains the
XInlude Element objects. I've called setXInluceAware(true) on my
DocumentBuilderFactory, and checked isXIncludeAware on my
DocumentBuilder, and it returns true.
I'm confident that my input documents are correct, since 'xmllint
--xinclude' on the command line works as I'd expect it to. xmllint uses
libxml2 afaik. I've tried this on Xerces 2.6.2, and I've just tried it
on the newly released 2.7.0 and the results are the same.
JAXP has always just 'done the right thing' for me up to now, so I'm not
familiar with the internals of the parsing process. I'm about to
download the source and add prints to trace what's going on, but before
I do that I'd like to see if anybody can spot any basic errors I'm
making. I've made a minimal test program to show what's happening, and
included the output. The program loads a Document, then recursively
prints the element tags.
Thanks in advance,
Peter Pimley
---- Test.java ----
import javax.xml.parsers.*;
import org.w3c.dom.*;
class Test {
public static void main (String [] args) throws Exception {
String filename = args[0];
System.err.println ("Loading from "+filename);
Document doc = load (filename);
recursivePrint (doc.getDocumentElement());
}
private static Document load (String filename) throws Exception {
// create a factory
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
System.err.println ("Factory is of type "+factory.getClass());
factory.setXIncludeAware (true);
System.err.println ("XIncludeAware is "+factory.isXIncludeAware());
// create a builder
DocumentBuilder builder = factory.newDocumentBuilder ();
System.err.println ("Builder created of type "+builder.getClass());
System.err.println ("Builder XInlcude aware is
"+builder.isXIncludeAware());
System.err.println ("Parsing...");
Document doc = builder.parse (filename);
System.err.println ("Parsed.");
return doc;
}
private static void recursivePrint (Element e) {
String name = e.getNodeName();
System.err.println ("Start element "+name);
NodeList childNodes = e.getChildNodes();
for (int i=0; i<childNodes.getLength(); i++) {
Node n = childNodes.item(i);
if (n.getNodeType() != Node.ELEMENT_NODE) continue;
recursivePrint ((Element) n);
}
System.err.println ("End element "+name);
}
}
---- a.xml ----
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns:xi="http://www.w3.org/2001/XInclude">
<chapter id="1">This text is part of the main document</chapter>
<xi:include href="b.xml"/>
</book>
---- b.xml ----
<chapter id="2">This text is part of the included document</chapter>
---- command line output (Debian sarge, Java 1.5, Xerces 2.7.0) ----
[EMAIL PROTECTED]:preprocessor$ java -version
java version "1.5.0_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08)
Java HotSpot(TM) Client VM (build 1.5.0_01-b08, mixed mode, sharing)
[EMAIL PROTECTED]:preprocessor$ xmllint --xinclude a.xml
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns:xi="http://www.w3.org/2001/XInclude">
<chapter id="1">This text is part of the main document</chapter>
<chapter id="2">This text is part of the included document</chapter>
</book>
[EMAIL PROTECTED]:preprocessor$ java -Djaxp.debug=1
-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
-cp .:xerces-2.7.0.jar Test a.xml
Loading from a.xml
JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
JAXP: found system property,
value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
JAXP: created new instance of class
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl using ClassLoader:
[EMAIL PROTECTED]
Factory is of type class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
XIncludeAware is true
Builder created of type class org.apache.xerces.jaxp.DocumentBuilderImpl
Builder XInlcude aware is true
Parsing...
Parsed.
Start element book
Start element chapter
End element chapter
Start element xi:include <------- The include tag has not been
resolved :(
End element xi:include
End element book
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]