saxonica.com

Third-party Object Models: DOM, JDOM, XOM, and DOM4J

This section is relevant to the Java platform only.

In the case of DOM, all Saxon editions support DOM access "out of the box", and no special configuration action is necessary.

In addition, Saxon allows various third-party object models to be used to supply the input to a transformation or query. Specifically, it supports JDOM, XOM, and DOM4J in addition to DOM. In Saxon 9.2 the support code for these three models is integrated into the main JAR files for Saxon-PE and Saxon-EE, but (unlike the case of DOM) it is not activated unless the object model is registered with the Configuration, which can be done either by including it in the relevant section of the configuration file, or by nominating it using the method registerExternalObjectModel(). Support for JDOM, XOM, and DOM4J is not available "out of the box" with Saxon-HE, but the source code is open source (in sub-packages of net.sf.saxon.option) and can be compiled for use with Saxon-HE if required.

For DOM input, the source can be supplied by wrapping a DOMSource around the DOM Document node. For JDOM, XOM, and DOM4J the approach is similar, except that the wrapper classes are supplied by Saxon itself: they are net.sf.saxon.jdom.DocumentWrapper, net.sf.saxon.xom.DocumentWrapper, and net.sf.saxon.dom4j.DocumentWrapper, and respectively. These wrapper classes implement the Saxon NodeInfo interface (which means that they also implement Source).

None of these models is likely to be as efficient as using Saxon's native tree model. For best performance, you should avoid using a DOM, JDOM, XOM, or DOM4J source. These models should only be used if your application needs to construct them for other reasons.

Note that the Xerces DOM implementation is not thread-safe, even for read-only access. Never use a DOMSource in several threads concurrently, unless you have checked that the DOM implementation you are using is thread-safe.

Saxon supports these models by wrapping each DOM, JDOM, XOM, or DOM4J node in a wrapper that implements the Saxon NodeInfo interface. When nodes are returned by the XQuery or XPath API, these wrappers are removed and the original node is returned. Similarly, the wrappers are generally removed when extension functions expecting a node are called.

In the case of DOM only, Saxon also supports a wrapping the other way around: an object implementing the DOM interface may be wrapped around a Saxon NodeInfo. This is done when Java methods expecting a DOM Node are called as extension functions, if the NodeInfo is not itself a wrapper for a DOM Node.

You can also send output to a DOM by using a DOMResult, or to a JDOM tree by using a JDOMResult, or to a XOM document by using a XOMWriter. In such cases it is a good idea to set saxon:require-well-formed="yes" on xsl:output to ensure that the transformation or query result is a well-formed document (for example, that it does not contain several elements at the top level).

Next