📄 xpathimpl.java
字号:
} try { XObject resultObject = eval( expression, item ); return getResultAsType( resultObject, returnType ); } catch ( java.lang.NullPointerException npe ) { // If VariableResolver returns null Or if we get // NullPointerException at this stage for some other reason // then we have to reurn XPathException throw new XPathExpressionException ( npe ); } catch ( javax.xml.transform.TransformerException te ) { Throwable nestedException = te.getException(); if ( nestedException instanceof javax.xml.xpath.XPathFunctionException ) { throw (javax.xml.xpath.XPathFunctionException)nestedException; } else { // For any other exceptions we need to throw // XPathExpressionException ( as per spec ) throw new XPathExpressionException ( te ); } } } private boolean isSupported( QName returnType ) { if ( ( returnType.equals( XPathConstants.STRING ) ) || ( returnType.equals( XPathConstants.NUMBER ) ) || ( returnType.equals( XPathConstants.BOOLEAN ) ) || ( returnType.equals( XPathConstants.NODE ) ) || ( returnType.equals( XPathConstants.NODESET ) ) ) { return true; } return false; } private Object getResultAsType( XObject resultObject, QName returnType ) throws javax.xml.transform.TransformerException { // XPathConstants.STRING if ( returnType.equals( XPathConstants.STRING ) ) { return resultObject.str(); } // XPathConstants.NUMBER if ( returnType.equals( XPathConstants.NUMBER ) ) { return new Double ( resultObject.num()); } // XPathConstants.BOOLEAN if ( returnType.equals( XPathConstants.BOOLEAN ) ) { return new Boolean( resultObject.bool()); } // XPathConstants.NODESET ---ORdered, UNOrdered??? if ( returnType.equals( XPathConstants.NODESET ) ) { return resultObject.nodelist(); } // XPathConstants.NODE if ( returnType.equals( XPathConstants.NODE ) ) { NodeIterator ni = resultObject.nodeset(); //Return the first node, or null return ni.nextNode(); } String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_UNSUPPORTED_RETURN_TYPE, new Object[] { returnType.toString()}); throw new IllegalArgumentException( fmsg ); } /** * <p>Evaluate an XPath expression in the specified context and return the result as a <code>String</code>.</p> * * <p>This method calls {@link #evaluate(String expression, Object item, QName returnType)} with a <code>returnType</code> of * {@link XPathConstants#STRING}.</p> * * <p>See "Evaluation of XPath Expressions" of JAXP 1.3 spec * for context item evaluation, * variable, function and QName resolution and return type conversion.</p> * * <p>If a <code>null</code> value is provided for * <code>item</code>, an empty document will be used for the * context. * If <code>expression</code> is <code>null</code>, then a <code>NullPointerException</code> is thrown.</p> * * @param expression The XPath expression. * @param item The starting context (node or node list, for example). * * @return The <code>String</code> that is the result of evaluating the expression and * converting the result to a <code>String</code>. * * @throws XPathExpressionException If <code>expression</code> cannot be evaluated. * @throws NullPointerException If <code>expression</code> is <code>null</code>. */ public String evaluate(String expression, Object item) throws XPathExpressionException { return (String)this.evaluate( expression, item, XPathConstants.STRING ); } /** * <p>Compile an XPath expression for later evaluation.</p> * * <p>If <code>expression</code> contains any {@link XPathFunction}s, * they must be available via the {@link XPathFunctionResolver}. * An {@link XPathExpressionException} will be thrown if the <code>XPathFunction</code> * cannot be resovled with the <code>XPathFunctionResolver</code>.</p> * * <p>If <code>expression</code> is <code>null</code>, a <code>NullPointerException</code> is thrown.</p> * * @param expression The XPath expression. * * @return Compiled XPath expression. * @throws XPathExpressionException If <code>expression</code> cannot be compiled. * @throws NullPointerException If <code>expression</code> is <code>null</code>. */ public XPathExpression compile(String expression) throws XPathExpressionException { if ( expression == null ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_ARG_CANNOT_BE_NULL, new Object[] {"XPath expression"} ); throw new NullPointerException ( fmsg ); } try { com.sun.org.apache.xpath.internal.XPath xpath = new XPath (expression, null, prefixResolver, com.sun.org.apache.xpath.internal.XPath.SELECT ); // Can have errorListener XPathExpressionImpl ximpl = new XPathExpressionImpl (xpath, prefixResolver, functionResolver, variableResolver, featureSecureProcessing ); return ximpl; } catch ( javax.xml.transform.TransformerException te ) { throw new XPathExpressionException ( te ) ; } } /** * <p>Evaluate an XPath expression in the context of the specified <code>InputSource</code> * and return the result as the specified type.</p> * * <p>This method builds a data model for the {@link InputSource} and calls * {@link #evaluate(String expression, Object item, QName returnType)} on the resulting document object.</p> * * <p>See "Evaluation of XPath Expressions" section of JAXP 1.3 spec * for context item evaluation, * variable, function and QName resolution and return type conversion.</p> * * <p>If <code>returnType</code> is not one of the types defined in {@link XPathConstants}, * then an <code>IllegalArgumentException</code> is thrown.</p> * * <p>If <code>expression</code>, <code>source</code> or <code>returnType</code> is <code>null</code>, * then a <code>NullPointerException</code> is thrown.</p> * * @param expression The XPath expression. * @param source The input source of the document to evaluate over. * @param returnType The desired return type. * * @return The <code>Object</code> that encapsulates the result of evaluating the expression. * * @throws XPathExpressionException If expression cannot be evaluated. * @throws IllegalArgumentException If <code>returnType</code> is not one of the types defined in {@link XPathConstants}. * @throws NullPointerException If <code>expression</code>, <code>source</code> or <code>returnType</code> * is <code>null</code>. */ public Object evaluate(String expression, InputSource source, QName returnType) throws XPathExpressionException { // Checking validity of different parameters if( source== null ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_ARG_CANNOT_BE_NULL, new Object[] {"source"} ); throw new NullPointerException ( fmsg ); } if ( expression == null ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_ARG_CANNOT_BE_NULL, new Object[] {"XPath expression"} ); throw new NullPointerException ( fmsg ); } if ( returnType == null ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_ARG_CANNOT_BE_NULL, new Object[] {"returnType"} ); throw new NullPointerException ( fmsg ); } //Checking if requested returnType is supported. //returnType need to be defined in XPathConstants if ( !isSupported ( returnType ) ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_UNSUPPORTED_RETURN_TYPE, new Object[] { returnType.toString() } ); throw new IllegalArgumentException ( fmsg ); } try { Document document = getParser().parse( source ); XObject resultObject = eval( expression, document ); return getResultAsType( resultObject, returnType ); } catch ( SAXException e ) { throw new XPathExpressionException ( e ); } catch( IOException e ) { throw new XPathExpressionException ( e ); } catch ( javax.xml.transform.TransformerException te ) { Throwable nestedException = te.getException(); if ( nestedException instanceof javax.xml.xpath.XPathFunctionException ) { throw (javax.xml.xpath.XPathFunctionException)nestedException; } else { throw new XPathExpressionException ( te ); } } } /** * <p>Evaluate an XPath expression in the context of the specified <code>InputSource</code> * and return the result as a <code>String</code>.</p> * * <p>This method calls {@link #evaluate(String expression, InputSource source, QName returnType)} with a * <code>returnType</code> of {@link XPathConstants#STRING}.</p> * * <p>See "Evaluation of XPath Expressions" section of JAXP 1.3 spec * for context item evaluation, * variable, function and QName resolution and return type conversion.</p> * * <p>If <code>expression</code> or <code>source</code> is <code>null</code>, * then a <code>NullPointerException</code> is thrown.</p> * * @param expression The XPath expression. * @param source The <code>InputSource</code> of the document to evaluate over. * * @return The <code>String</code> that is the result of evaluating the expression and * converting the result to a <code>String</code>. * * @throws XPathExpressionException If expression cannot be evaluated. * @throws NullPointerException If <code>expression</code> or <code>source</code> is <code>null</code>. */ public String evaluate(String expression, InputSource source) throws XPathExpressionException { return (String)this.evaluate( expression, source, XPathConstants.STRING ); } /** * <p>Reset this <code>XPath</code> to its original configuration.</p> * * <p><code>XPath</code> is reset to the same state as when it was created with * {@link XPathFactory#newXPath()}. * <code>reset()</code> is designed to allow the reuse of existing <code>XPath</code>s * thus saving resources associated with the creation of new <code>XPath</code>s.</p> * * <p>The reset <code>XPath</code> is not guaranteed to have the same * {@link XPathFunctionResolver}, {@link XPathVariableResolver} * or {@link NamespaceContext} <code>Object</code>s, e.g. {@link Object#equals(Object obj)}. * It is guaranteed to have a functionally equal <code>XPathFunctionResolver</code>, * <code>XPathVariableResolver</code> * and <code>NamespaceContext</code>.</p> */ public void reset() { this.variableResolver = this.origVariableResolver; this.functionResolver = this.origFunctionResolver; this.namespaceContext = null; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -