/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef AXIOM_XPATH_H #define AXIOM_XPATH_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * @defgroup axiom_xpath_api api * @ingroup axiom_xpath * @{ */ /** * Enable tracing */ #define AXIOM_XPATH_DEBUG /** * An error occured while evaluating the xpath expression */ #define AXIOM_XPATH_EVALUATION_ERROR 0 #define AXIOM_XPATH_ERROR_STREAMING_NOT_SUPPORTED 10 /* Typedefs */ /** * XPath expression * It includes the expression as a string and parsed data. */ typedef struct axiom_xpath_expression axiom_xpath_expression_t; /** * The XPath context * Keeps a reference to the context node or attribute, * XPath expression, environment and result set. */ typedef struct axiom_xpath_context axiom_xpath_context_t; /** * XPath result set * Contains the result set and other information such as * whether the expression was evaluated successfully. */ typedef struct axiom_xpath_result axiom_xpath_result_t; /** * XPath result * Stores type and value of the result. */ typedef struct axiom_xpath_result_node axiom_xpath_result_node_t; /** * XPath result types */ typedef enum axiom_xpath_result_type_t { AXIOM_XPATH_TYPE_NODE = 0, AXIOM_XPATH_TYPE_ATTRIBUTE, AXIOM_XPATH_TYPE_NAMESPACE, AXIOM_XPATH_TYPE_TEXT, AXIOM_XPATH_TYPE_NUMBER, AXIOM_XPATH_TYPE_BOOLEAN } axiom_xpath_result_type_t; typedef int (*axiom_xpath_function_t)(axiom_xpath_context_t *context, int np); /** * XPath expression */ struct axiom_xpath_expression { /** XPath expression as a string */ axis2_char_t* expr_str; /** Length of the expression */ int expr_len; /** A cursor pointing to the position currently being parsed */ int expr_ptr; /** Parsed expression in an array list*/ axutil_array_list_t *operations; /** A pointer to the start operation in operations */ int start; }; /** * XPath context */ struct axiom_xpath_context { /** Environment */ const axutil_env_t *env; /** List of namespaces */ axutil_hash_t *namespaces; /** Set of functions */ axutil_hash_t *functions; /** Root node */ axiom_node_t *root_node; /** Context node */ axiom_node_t *node; /** Context attribute */ axiom_attribute_t *attribute; /** Context attribute */ axiom_namespace_t *ns; /** Context position */ int position; /** Context size * *Does not work location paths due to optimizations */ int size; /** XPath expression */ axiom_xpath_expression_t *expr; /** Streaming */ axis2_bool_t streaming; /** Stack of processed items */ axutil_stack_t *stack; /* TODO: functions variables etc */ }; /** * XPath result set */ struct axiom_xpath_result { /** A flag indicating whether errors occured while evaluting XPath * expression */ int flag; /** An array list containing the set of results */ axutil_array_list_t * nodes; }; /** * XPath result */ struct axiom_xpath_result_node { /** Type of result */ axiom_xpath_result_type_t type; /** Value */ void * value; }; /** * Compile an XPath expression * * @param env Environment must not be null * @param xpath_expr A pointer to the XPath expression * @return The parsed XPath expression. Returns NULL if an error occured * while parsing. */ AXIS2_EXTERN axiom_xpath_expression_t * AXIS2_CALL axiom_xpath_compile_expression( const axutil_env_t *env, const axis2_char_t* xpath_expr); /** * Create an empty XPath context * * @param env Environment must not be null * @param root_node A pointer to the root of the tree * @return The initialized XPath context. */ AXIS2_EXTERN axiom_xpath_context_t * AXIS2_CALL axiom_xpath_context_create( const axutil_env_t *env, axiom_node_t * root_node); /** * Evaluate an parsed XPath expression. Different expressions could * be evaluated on the same context, and same expression could be * evaluated on multiple trees without recompiling. * * @param context XPath context must not be null * @param xpath_expr XPath expression to be evaluated * @return The set of results. */ AXIS2_EXTERN axiom_xpath_result_t * AXIS2_CALL axiom_xpath_evaluate( axiom_xpath_context_t *context, axiom_xpath_expression_t *xpath_expr); /** * Convert an XPath result to a boolean. * If the result is a boolean the value of it is returned. * If the result is a number, AXIS2_TRUE is * returned if the value is not equal to 0 and AXIS2_FALSE otherwise. * Otherwise AXIS2_TRUE is returned if the result is not NULL and AXIS2_FALSE otherwise. * * @param env Environment must not be null * @param node A pointer to the XPath result * @return The boolean value. */ AXIS2_EXTERN axis2_bool_t AXIS2_CALL axiom_xpath_cast_node_to_boolean( const axutil_env_t *env, axiom_xpath_result_node_t * node); /** * Convert an XPath result to a number. * If the result is a boolean, 1 is returned if it's true and 0 otherwise. * If the result is a number the value of it is returned. * Otherwise AXIS2_TRUE is returned if the result is not NULL and AXIS2_FALSE otherwise. * * @param env Environment must not be null * @param node A pointer to the XPath result * @return The numerical value. */ AXIS2_EXTERN double AXIS2_CALL axiom_xpath_cast_node_to_number( const axutil_env_t *env, axiom_xpath_result_node_t * node); /** * Convert an XPath result to text. * If the result is a boolean, "true" is returned if it's true and "false" otherwise. * If the result is a number the text representation of it is returned. * If the result is a text the value of it is returned. * If the result is an axiom node, the text value of it is returned * If the result is an axiom attribue, the text value of it is returned * * @param env Environment must not be null * @param node A pointer to the XPath result * @return The text value. */ AXIS2_EXTERN axis2_char_t * AXIS2_CALL axiom_xpath_cast_node_to_string( const axutil_env_t *env, axiom_xpath_result_node_t * node); /** * Convert an XPath result to an axiom node. * If the result is an axiom node it is returned and NULL otherwise. * * @param env Environment must not be null * @param node A pointer to the XPath result * @return The axiom node. */ AXIS2_EXTERN axiom_node_t * AXIS2_CALL axiom_xpath_cast_node_to_axiom_node( const axutil_env_t *env, axiom_xpath_result_node_t * node); /** * Free XPath context * * @param env Environment must not be null * @param context XPath context must not be null */ AXIS2_EXTERN void AXIS2_CALL axiom_xpath_free_context( const axutil_env_t *env, axiom_xpath_context_t *context); /** * Free XPath expression * * @param env Environment must not be null * @param xpath_expr XPath expression must not be null */ AXIS2_EXTERN void AXIS2_CALL axiom_xpath_free_expression( const axutil_env_t *env, axiom_xpath_expression_t * xpath_expr); /** * Free XPath result set * * @param env Environment must not be null * @param result XPath result set must not be null */ AXIS2_EXTERN void AXIS2_CALL axiom_xpath_free_result( const axutil_env_t *env, axiom_xpath_result_t* result); /** * Registers a XPath namespace * * @param context XPath Context, must not be null * @param ns AXIOM namespace, must not be null */ AXIS2_EXTERN void AXIS2_CALL axiom_xpath_register_namespace( axiom_xpath_context_t *context, axiom_namespace_t *ns); /** * Get a registered namespace by the prefix. * If there is no namespace registered by the given prefix NULL will be returned * * @param context XPath Context, must not be null * @param prefix Prefix of the namespace, must not be null * @return The namespace corresponding to the prefix. */ AXIS2_EXTERN axiom_namespace_t * AXIS2_CALL axiom_xpath_get_namespace( axiom_xpath_context_t *context, axis2_char_t *prefix); /** * Clears all registered XPath namespaces * * @param context XPath Context, must not be null */ AXIS2_EXTERN void AXIS2_CALL axiom_xpath_clear_namespaces( axiom_xpath_context_t *context); /** * Evaluates an XPath expression on streaming XML. * Not all expressions can be evaluated on streaming XML. * If the expression cannot be evaluated on streaming XML NULL will be returned. * * @param context XPath Context, must not be null * @param xpath_expr XPath expression to be evaluated */ AXIS2_EXTERN axiom_xpath_result_t * AXIS2_CALL axiom_xpath_evaluate_streaming( axiom_xpath_context_t *context, axiom_xpath_expression_t *xpath_expr); /** * Checks whether the given expression can be evaluated on streaming XML. * If it is possible AXIS2_TRUE will be retuned; AXIS2_FALSE otherwise. * * @param env Axis2 environment, must not be null * @param expr Complied XPath expression, must not be null * @return A boolean indicating whether the expression can be evaluated on streaming XML. */ AXIS2_EXTERN axis2_bool_t AXIS2_CALL axiom_xpath_streaming_check( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Setup the XPath core function library * * @param context XPath Context, must not be null */ AXIS2_EXTERN void AXIS2_CALL axiom_xpath_register_default_functions_set( axiom_xpath_context_t *context); /** * Registers a custom XPath function http://www.w3.org/TR/xpath#corelib * * @param context XPath Context, must not be null * @param name Name of the function, must not be null * @param func Pointer to the function, must not be null */ AXIS2_EXTERN void AXIS2_CALL axiom_xpath_register_function( axiom_xpath_context_t *context, axis2_char_t *name, axiom_xpath_function_t func); /** * Retrive a pointer to a registered funciton by the function name. * If there is no function registered by the given name, NULL will be returned. * * @param context XPath Context, must not be null * @param name Name of the function, must not be null * @return The corresponding function. */ AXIS2_EXTERN axiom_xpath_function_t AXIS2_CALL axiom_xpath_get_function( axiom_xpath_context_t *context, axis2_char_t *name); /** @} */ #ifdef __cplusplus } #endif #endif