XPathExpressionImplpublic class XPathExpressionImpl extends Object implements XPathExpressionThe class provides an implementation of XPathExpression according
to the DOM L3 XPath Specification, Working Group Note 26 February 2004.
See also the Document Object Model (DOM) Level 3 XPath Specification.
The XPathExpression interface represents a parsed and resolved
XPath expression. |
Fields Summary |
---|
private final XPath | m_xpathThe xpath object that this expression wraps | private final Document | m_docThe document to be searched to parallel the case where the XPathEvaluator
is obtained by casting a Document. |
Constructors Summary |
---|
XPathExpressionImpl(XPath xpath, Document doc)Constructor for XPathExpressionImpl.
m_xpath = xpath;
m_doc = doc;
|
Methods Summary |
---|
public java.lang.Object | evaluate(org.w3c.dom.Node contextNode, short type, java.lang.Object result)This method provides an implementation XPathResult.evaluate according
to the DOM L3 XPath Specification, Working Group Note 26 February 2004.
See also the Document Object Model (DOM) Level 3 XPath Specification.
Evaluates this XPath expression and returns a result.
// If the XPathEvaluator was determined by "casting" the document
if (m_doc != null) {
// Check that the context node is owned by the same document
if ((contextNode != m_doc) && (!contextNode.getOwnerDocument().equals(m_doc))) {
String fmsg = XPATHMessages.createXPATHMessage(XPATHErrorResources.ER_WRONG_DOCUMENT, null);
throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, fmsg);
}
// Check that the context node is an acceptable node type
short nodeType = contextNode.getNodeType();
if ((nodeType != Document.DOCUMENT_NODE) &&
(nodeType != Document.ELEMENT_NODE) &&
(nodeType != Document.ATTRIBUTE_NODE) &&
(nodeType != Document.TEXT_NODE) &&
(nodeType != Document.CDATA_SECTION_NODE) &&
(nodeType != Document.COMMENT_NODE) &&
(nodeType != Document.PROCESSING_INSTRUCTION_NODE) &&
(nodeType != XPathNamespace.XPATH_NAMESPACE_NODE)) {
String fmsg = XPATHMessages.createXPATHMessage(XPATHErrorResources.ER_WRONG_NODETYPE, null);
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, fmsg);
}
}
//
// If the type is not a supported type, throw an exception and be
// done with it!
if (!XPathResultImpl.isValidType(type)) {
String fmsg = XPATHMessages.createXPATHMessage(XPATHErrorResources.ER_INVALID_XPATH_TYPE, new Object[] {new Integer(type)});
throw new XPathException(XPathException.TYPE_ERR,fmsg); // Invalid XPath type argument: {0}
}
// Cache xpath context?
XPathContext xpathSupport = new XPathContext();
// if m_document is not null, build the DTM from the document
if (null != m_doc) {
xpathSupport.getDTMHandleFromNode(m_doc);
}
XObject xobj = null;
try {
xobj = m_xpath.execute(xpathSupport, contextNode, null);
} catch (TransformerException te) {
// What should we do here?
throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,te.getMessageAndLocation());
}
// Create a new XPathResult object
// Reuse result object passed in?
// The constructor will check the compatibility of type and xobj and
// throw an exception if they are not compatible.
return new XPathResultImpl(type,xobj,contextNode, m_xpath);
|
|