org.apache.xpath
Class CachedXPathAPI

java.lang.Object
  extended by org.apache.xpath.CachedXPathAPI

public class CachedXPathAPI
extends java.lang.Object

The methods in this class are convenience methods into the low-level XPath API. These functions tend to be a little slow, since a number of objects must be created for each evaluation. A faster way is to precompile the XPaths using the low-level API, and then just use the XPaths over and over. This is an alternative for the old XPathAPI class, which provided static methods for the purpose but had the drawback of instantiating a new XPathContext (and thus building a new DTMManager, and new DTMs) each time it was called. XPathAPIObject instead retains its context as long as the object persists, reusing the DTMs. This does have a downside: if you've changed your source document, you should obtain a new XPathAPIObject to continue searching it, since trying to use the old DTMs will probably yield bad results or malfunction outright... and the cached DTMs may consume memory until this object and its context are returned to the heap. Essentially, it's the caller's responsibility to decide when to discard the cache.

See Also:
XPath Specification

Field Summary
protected  XPathContext xpathSupport
          XPathContext, and thus the document model system (DTMs), persists through multiple calls to this object.
 
Constructor Summary
CachedXPathAPI()
          Default constructor.
CachedXPathAPI(CachedXPathAPI priorXPathAPI)
          This constructor shares its XPathContext with a pre-existing CachedXPathAPI.
 
Method Summary
 XObject eval(org.w3c.dom.Node contextNode, java.lang.String str)
          Evaluate XPath string to an XObject.
 XObject eval(org.w3c.dom.Node contextNode, java.lang.String str, org.w3c.dom.Node namespaceNode)
          Evaluate XPath string to an XObject.
 XObject eval(org.w3c.dom.Node contextNode, java.lang.String str, PrefixResolver prefixResolver)
          Evaluate XPath string to an XObject.
 XPathContext getXPathContext()
          Returns the XPathSupport object used in this CachedXPathAPI %REVIEW% I'm somewhat concerned about the loss of encapsulation this causes, but the xml-security folks say they need it.
 org.w3c.dom.traversal.NodeIterator selectNodeIterator(org.w3c.dom.Node contextNode, java.lang.String str)
          Use an XPath string to select a nodelist.
 org.w3c.dom.traversal.NodeIterator selectNodeIterator(org.w3c.dom.Node contextNode, java.lang.String str, org.w3c.dom.Node namespaceNode)
          Use an XPath string to select a nodelist.
 org.w3c.dom.NodeList selectNodeList(org.w3c.dom.Node contextNode, java.lang.String str)
          Use an XPath string to select a nodelist.
 org.w3c.dom.NodeList selectNodeList(org.w3c.dom.Node contextNode, java.lang.String str, org.w3c.dom.Node namespaceNode)
          Use an XPath string to select a nodelist.
 org.w3c.dom.Node selectSingleNode(org.w3c.dom.Node contextNode, java.lang.String str)
          Use an XPath string to select a single node.
 org.w3c.dom.Node selectSingleNode(org.w3c.dom.Node contextNode, java.lang.String str, org.w3c.dom.Node namespaceNode)
          Use an XPath string to select a single node.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

xpathSupport

protected XPathContext xpathSupport
XPathContext, and thus the document model system (DTMs), persists through multiple calls to this object. This is set in the constructor.

Constructor Detail

CachedXPathAPI

public CachedXPathAPI()

Default constructor. Establishes its own XPathContext, and hence its own DTMManager. Good choice for simple uses.

Note that any particular instance of CachedXPathAPI must not be operated upon by multiple threads without synchronization; we do not currently support multithreaded access to a single DTM.


CachedXPathAPI

public CachedXPathAPI(CachedXPathAPI priorXPathAPI)

This constructor shares its XPathContext with a pre-existing CachedXPathAPI. That allows sharing document models (DTM) and previously established location state.

Note that the original CachedXPathAPI and the new one should not be operated upon concurrently; we do not support multithreaded access to a single DTM at this time. Similarly, any particular instance of CachedXPathAPI must not be operated upon by multiple threads without synchronization.

%REVIEW% Should this instead do a clone-and-reset on the XPathSupport object?

Method Detail

getXPathContext

public XPathContext getXPathContext()
Returns the XPathSupport object used in this CachedXPathAPI %REVIEW% I'm somewhat concerned about the loss of encapsulation this causes, but the xml-security folks say they need it.


selectSingleNode

public org.w3c.dom.Node selectSingleNode(org.w3c.dom.Node contextNode,
                                         java.lang.String str)
                                  throws javax.xml.transform.TransformerException
Use an XPath string to select a single node. XPath namespace prefixes are resolved from the context node, which may not be what you want (see the next method).

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
Returns:
The first node found that matches the XPath, or null.
Throws:
javax.xml.transform.TransformerException

selectSingleNode

public org.w3c.dom.Node selectSingleNode(org.w3c.dom.Node contextNode,
                                         java.lang.String str,
                                         org.w3c.dom.Node namespaceNode)
                                  throws javax.xml.transform.TransformerException
Use an XPath string to select a single node. XPath namespace prefixes are resolved from the namespaceNode.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
namespaceNode - The node from which prefixes in the XPath will be resolved to namespaces.
Returns:
The first node found that matches the XPath, or null.
Throws:
javax.xml.transform.TransformerException

selectNodeIterator

public org.w3c.dom.traversal.NodeIterator selectNodeIterator(org.w3c.dom.Node contextNode,
                                                             java.lang.String str)
                                                      throws javax.xml.transform.TransformerException
Use an XPath string to select a nodelist. XPath namespace prefixes are resolved from the contextNode.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
Returns:
A NodeIterator, should never be null.
Throws:
javax.xml.transform.TransformerException

selectNodeIterator

public org.w3c.dom.traversal.NodeIterator selectNodeIterator(org.w3c.dom.Node contextNode,
                                                             java.lang.String str,
                                                             org.w3c.dom.Node namespaceNode)
                                                      throws javax.xml.transform.TransformerException
Use an XPath string to select a nodelist. XPath namespace prefixes are resolved from the namespaceNode.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
namespaceNode - The node from which prefixes in the XPath will be resolved to namespaces.
Returns:
A NodeIterator, should never be null.
Throws:
javax.xml.transform.TransformerException

selectNodeList

public org.w3c.dom.NodeList selectNodeList(org.w3c.dom.Node contextNode,
                                           java.lang.String str)
                                    throws javax.xml.transform.TransformerException
Use an XPath string to select a nodelist. XPath namespace prefixes are resolved from the contextNode.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
Returns:
A NodeIterator, should never be null.
Throws:
javax.xml.transform.TransformerException

selectNodeList

public org.w3c.dom.NodeList selectNodeList(org.w3c.dom.Node contextNode,
                                           java.lang.String str,
                                           org.w3c.dom.Node namespaceNode)
                                    throws javax.xml.transform.TransformerException
Use an XPath string to select a nodelist. XPath namespace prefixes are resolved from the namespaceNode.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
namespaceNode - The node from which prefixes in the XPath will be resolved to namespaces.
Returns:
A NodeIterator, should never be null.
Throws:
javax.xml.transform.TransformerException

eval

public XObject eval(org.w3c.dom.Node contextNode,
                    java.lang.String str)
             throws javax.xml.transform.TransformerException
Evaluate XPath string to an XObject. Using this method, XPath namespace prefixes will be resolved from the namespaceNode.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
Returns:
An XObject, which can be used to obtain a string, number, nodelist, etc, should never be null.
Throws:
javax.xml.transform.TransformerException
See Also:
XObject, XNull, XBoolean, XNumber, XString, XRTreeFrag

eval

public XObject eval(org.w3c.dom.Node contextNode,
                    java.lang.String str,
                    org.w3c.dom.Node namespaceNode)
             throws javax.xml.transform.TransformerException
Evaluate XPath string to an XObject. XPath namespace prefixes are resolved from the namespaceNode. The implementation of this is a little slow, since it creates a number of objects each time it is called. This could be optimized to keep the same objects around, but then thread-safety issues would arise.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
namespaceNode - The node from which prefixes in the XPath will be resolved to namespaces.
Returns:
An XObject, which can be used to obtain a string, number, nodelist, etc, should never be null.
Throws:
javax.xml.transform.TransformerException
See Also:
XObject, XNull, XBoolean, XNumber, XString, XRTreeFrag

eval

public XObject eval(org.w3c.dom.Node contextNode,
                    java.lang.String str,
                    PrefixResolver prefixResolver)
             throws javax.xml.transform.TransformerException
Evaluate XPath string to an XObject. XPath namespace prefixes are resolved from the namespaceNode. The implementation of this is a little slow, since it creates a number of objects each time it is called. This could be optimized to keep the same objects around, but then thread-safety issues would arise.

Parameters:
contextNode - The node to start searching from.
str - A valid XPath string.
prefixResolver - Will be called if the parser encounters namespace prefixes, to resolve the prefixes to URLs.
Returns:
An XObject, which can be used to obtain a string, number, nodelist, etc, should never be null.
Throws:
javax.xml.transform.TransformerException
See Also:
XObject, XNull, XBoolean, XNumber, XString, XRTreeFrag