⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basexpath.java

📁 XML的解析、编译、查询等技术的JAVA源代码。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/BaseXPath.java,v 1.49 2006/02/05 21:47:41 elharo Exp $ * $Revision: 1.49 $ * $Date: 2006/02/05 21:47:41 $ * * ==================================================================== * * Copyright 2000-2002 bob mcwhirter & James Strachan. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: *  *   * Redistributions of source code must retain the above copyright *     notice, this list of conditions and the following disclaimer. *  *   * Redistributions in binary form must reproduce the above copyright *     notice, this list of conditions and the following disclaimer in the *     documentation and/or other materials provided with the distribution. *  *   * Neither the name of the Jaxen Project nor the names of its *     contributors may be used to endorse or promote products derived  *     from this software without specific prior written permission. *  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * This software consists of voluntary contributions made by many  * individuals on behalf of the Jaxen Project and was originally  * created by bob mcwhirter <bob@werken.com> and  * James Strachan <jstrachan@apache.org>.  For more information on the  * Jaxen Project, please see <http://www.jaxen.org/>. *  * $Id: BaseXPath.java,v 1.49 2006/02/05 21:47:41 elharo Exp $ */package org.jaxen;import java.io.Serializable;import java.util.List;import org.jaxen.expr.Expr;import org.jaxen.expr.XPathExpr;import org.jaxen.function.BooleanFunction;import org.jaxen.function.NumberFunction;import org.jaxen.function.StringFunction;import org.jaxen.saxpath.SAXPathException;import org.jaxen.saxpath.XPathReader;import org.jaxen.saxpath.helpers.XPathReaderFactory;import org.jaxen.util.SingletonList;/** Base functionality for all concrete, implementation-specific XPaths. * *  <p> *  This class provides generic functionality for further-defined *  implementation-specific XPaths. *  </p> * *  <p> *  If you want to adapt the Jaxen engine so that it can traverse your own *  object model, then this is a good base class to derive from. *  Typically you only really need to provide your own  *  {@link org.jaxen.Navigator} implementation. *  </p> * *  @see org.jaxen.dom4j.Dom4jXPath XPath for dom4j *  @see org.jaxen.jdom.JDOMXPath   XPath for JDOM *  @see org.jaxen.dom.DOMXPath     XPath for W3C DOM * *  @author <a href="mailto:bob@werken.com">bob mcwhirter</a> *  @author <a href="mailto:jstrachan@apache.org">James Strachan</a> */public class BaseXPath implements XPath, Serializable{    /** Original expression text. */    private String exprText;    /** the parsed form of the XPath expression */    private XPathExpr xpath;        /** the support information and function, namespace and variable contexts */    private ContextSupport support;    /** the implementation-specific Navigator for retrieving XML nodes **/    private Navigator navigator;        /** Construct given an XPath expression string.      *     *  @param xpathExpr the XPath expression     *     *  @throws JaxenException if there is a syntax error while     *          parsing the expression     */    protected BaseXPath(String xpathExpr) throws JaxenException    {        try        {            XPathReader reader = XPathReaderFactory.createReader();            JaxenHandler handler = new JaxenHandler();            reader.setXPathHandler( handler );            reader.parse( xpathExpr );            this.xpath = handler.getXPathExpr();        }        catch (org.jaxen.saxpath.XPathSyntaxException e)        {            throw new org.jaxen.XPathSyntaxException( e );        }        catch (SAXPathException e)        {            throw new JaxenException( e );        }        this.exprText = xpathExpr;    }    /** Construct given an XPath expression string.     *     *  @param xpathExpr the XPath expression     *     *  @param navigator the XML navigator to use     *     *  @throws JaxenException if there is a syntax error while     *          parsing the expression     */    public BaseXPath(String xpathExpr, Navigator navigator) throws JaxenException    {        this( xpathExpr );        this.navigator = navigator;    }    /** Evaluate this XPath against a given context.     *  The context of evaluation may be any object type     *  the navigator recognizes as a node.     *  The return value is either a <code>String</code>,     *  <code>Double</code>, <code>Boolean</code>, or <code>List</code>     *  of nodes.     *     *  <p>     *  When using this method, one must be careful to     *  test the class of the returned object.  If the returned      *  object is a list, then the items in this      *  list will be the actual <code>Document</code>,     *  <code>Element</code>, <code>Attribute</code>, etc. objects     *  as defined by the concrete XML object-model implementation,     *  directly from the context document.  This method <strong>does     *  not return <em>copies</em> of anything</strong>, but merely      *  returns references to objects within the source document.     *  </p>     *       * @param context the node, node-set or Context object for evaluation.      *      This value can be null.     *     * @return the result of evaluating the XPath expression     *          against the supplied context     * @throws JaxenException if an XPath error occurs during expression evaluation     * @throws ClassCastException if the context is not a node     */    public Object evaluate(Object context) throws JaxenException    {        List answer = selectNodes(context);        if ( answer != null             &&             answer.size() == 1 )        {            Object first = answer.get(0);            if ( first instanceof String                 ||                 first instanceof Number                 ||                 first instanceof Boolean )             {                return first;            }        }        return answer;    }        /** Select all nodes that are selected by this XPath     *  expression. If multiple nodes match, multiple nodes     *  will be returned. Nodes will be returned     *  in document-order, as defined by the XPath     *  specification. If the expression selects a non-node-set     *  (i.e. a number, boolean, or string) then a List     *  containing just that one object is returned.     *  </p>     *     * @param node the node, node-set or Context object for evaluation.      *     This value can be null.     *     * @return the node-set of all items selected     *          by this XPath expression     * @throws JaxenException if an XPath error occurs during expression evaluation     *     * @see #selectNodesForContext     */    public List selectNodes(Object node) throws JaxenException    {        Context context = getContext( node );        return selectNodesForContext( context );    }    /** Select only the first node selected by this XPath     *  expression.  If multiple nodes match, only one node will be     *  returned. The selected node will be the first     *  selected node in document-order, as defined by the XPath     *  specification.     *  </p>     *     * @param node the node, node-set or Context object for evaluation.      *     This value can be null.     *     * @return the node-set of all items selected     *          by this XPath expression     * @throws JaxenException if an XPath error occurs during expression evaluation     *     * @see #selectNodes     */    public Object selectSingleNode(Object node) throws JaxenException    {        List results = selectNodes( node );        if ( results.isEmpty() )        {            return null;        }        return results.get( 0 );    }    /**     * Returns the XPath string-value of the argument node.     *      * @param node the node whose value to take     * @return the XPath string value of this node     * @throws JaxenException if an XPath error occurs during expression evaluation     * @deprecated replaced by {@link #stringValueOf}     */    public String valueOf(Object node) throws JaxenException    {        return stringValueOf( node );    }    /** Retrieves the string-value of the result of     *  evaluating this XPath expression when evaluated      *  against the specified context.     *     *  <p>     *  The string-value of the expression is determined per     *  the <code>string(..)</code> core function defined     *  in the XPath specification.  This means that an expression     *  that selects zero nodes will return the empty string,     *  while an expression that selects one-or-more nodes will     *  return the string-value of the first node.     *  </p>     *     * @param node the node, node-set or Context object for evaluation. This value can be null.     *     * @return the string-value of the result of evaluating this expression with the specified context node     * @throws JaxenException if an XPath error occurs during expression evaluation     */    public String stringValueOf(Object node) throws JaxenException    {        Context context = getContext( node );                Object result = selectSingleNodeForContext( context );        if ( result == null )        {            return "";        }        return StringFunction.evaluate( result,                                        context.getNavigator() );    }    /** Retrieve a boolean-value interpretation of this XPath     *  expression when evaluated against a given context.     *     *  <p>     *  The boolean-value of the expression is determined per     *  the <code>boolean(..)</code> function defined     *  in the XPath specification.  This means that an expression     *  that selects zero nodes will return <code>false</code>,     *  while an expression that selects one or more nodes will     *  return <code>true</code>.     *  </p>     *     * @param node the node, node-set or Context object for evaluation. This value can be null.     *     * @return the boolean-value of the result of evaluating this expression with the specified context node     * @throws JaxenException if an XPath error occurs during expression evaluation     */    public boolean booleanValueOf(Object node) throws JaxenException    {        Context context = getContext( node );        List result = selectNodesForContext( context );        if ( result == null ) return false;        return BooleanFunction.evaluate( result, context.getNavigator() ).booleanValue();    }    /** Retrieve a number-value interpretation of this XPath     *  expression when evaluated against a given context.     *     *  <p>     *  The number-value of the expression is determined per     *  the <code>number(..)</code> core function as defined     *  in the XPath specification. This means that if this     *  expression selects multiple nodes, the number-value     *  of the first node is returned.     *  </p>     *     * @param node the node, node-set or Context object for evaluation. This value can be null.     *     * @return a <code>Double</code> indicating the numeric value of     *      evaluating this expression against the specified context     * @throws JaxenException if an XPath error occurs during expression evaluation     */    public Number numberValueOf(Object node) throws JaxenException    {        Context context = getContext( node );        Object result = selectSingleNodeForContext( context );        return NumberFunction.evaluate( result,                                        context.getNavigator() );    }    // Helpers    /** Add a namespace prefix-to-URI mapping for this XPath     *  expression.     *     *  <p>     *  Namespace prefix-to-URI mappings in an XPath are independent     *  of those used within any document.  Only the mapping explicitly     *  added to this XPath will be available for resolving the     *  XPath expression.     *  </p>     *     *  <p>     *  This is a convenience method for adding mappings to the     *  default {@link NamespaceContext} in place for this XPath.     *  If you have installed a custom <code>NamespaceContext</code>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -