codekingpro/portable-devtools
116k
1/*2 * Summary: XML Path Language implementation3 * Description: API for the XML Path Language implementation4 *5 * XML Path Language implementation6 * XPath is a language for addressing parts of an XML document,7 * designed to be used by both XSLT and XPointer8 * http://www.w3.org/TR/xpath9 *10 * Implements11 * W3C Recommendation 16 November 199912 * http://www.w3.org/TR/1999/REC-xpath-1999111613 *14 * Copy: See Copyright for the status of this software.15 *16 * Author: Daniel Veillard17 */18 19#ifndef __XML_XPATH_H__20#define __XML_XPATH_H__21 22#include <libxml/xmlversion.h>23 24#ifdef LIBXML_XPATH_ENABLED25 26#include <libxml/xmlerror.h>27#include <libxml/tree.h>28#include <libxml/hash.h>29#endif /* LIBXML_XPATH_ENABLED */30 31#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)32#ifdef __cplusplus33extern "C" {34#endif35#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */36 37#ifdef LIBXML_XPATH_ENABLED38 39typedef struct _xmlXPathContext xmlXPathContext;40typedef xmlXPathContext *xmlXPathContextPtr;41typedef struct _xmlXPathParserContext xmlXPathParserContext;42typedef xmlXPathParserContext *xmlXPathParserContextPtr;43 44/**45 * The set of XPath error codes.46 */47 48typedef enum {49 XPATH_EXPRESSION_OK = 0,50 XPATH_NUMBER_ERROR,51 XPATH_UNFINISHED_LITERAL_ERROR,52 XPATH_START_LITERAL_ERROR,53 XPATH_VARIABLE_REF_ERROR,54 XPATH_UNDEF_VARIABLE_ERROR,55 XPATH_INVALID_PREDICATE_ERROR,56 XPATH_EXPR_ERROR,57 XPATH_UNCLOSED_ERROR,58 XPATH_UNKNOWN_FUNC_ERROR,59 XPATH_INVALID_OPERAND,60 XPATH_INVALID_TYPE,61 XPATH_INVALID_ARITY,62 XPATH_INVALID_CTXT_SIZE,63 XPATH_INVALID_CTXT_POSITION,64 XPATH_MEMORY_ERROR,65 XPTR_SYNTAX_ERROR,66 XPTR_RESOURCE_ERROR,67 XPTR_SUB_RESOURCE_ERROR,68 XPATH_UNDEF_PREFIX_ERROR,69 XPATH_ENCODING_ERROR,70 XPATH_INVALID_CHAR_ERROR,71 XPATH_INVALID_CTXT,72 XPATH_STACK_ERROR,73 XPATH_FORBID_VARIABLE_ERROR,74 XPATH_OP_LIMIT_EXCEEDED,75 XPATH_RECURSION_LIMIT_EXCEEDED76} xmlXPathError;77 78/*79 * A node-set (an unordered collection of nodes without duplicates).80 */81typedef struct _xmlNodeSet xmlNodeSet;82typedef xmlNodeSet *xmlNodeSetPtr;83struct _xmlNodeSet {84 int nodeNr; /* number of nodes in the set */85 int nodeMax; /* size of the array as allocated */86 xmlNodePtr *nodeTab; /* array of nodes in no particular order */87 /* @@ with_ns to check whether namespace nodes should be looked at @@ */88};89 90/*91 * An expression is evaluated to yield an object, which92 * has one of the following four basic types:93 * - node-set94 * - boolean95 * - number96 * - string97 *98 * @@ XPointer will add more types !99 */100 101typedef enum {102 XPATH_UNDEFINED = 0,103 XPATH_NODESET = 1,104 XPATH_BOOLEAN = 2,105 XPATH_NUMBER = 3,106 XPATH_STRING = 4,107#ifdef LIBXML_XPTR_LOCS_ENABLED108 XPATH_POINT = 5,109 XPATH_RANGE = 6,110 XPATH_LOCATIONSET = 7,111#endif112 XPATH_USERS = 8,113 XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */114} xmlXPathObjectType;115 116#ifndef LIBXML_XPTR_LOCS_ENABLED117/** DOC_DISABLE */118#define XPATH_POINT 5119#define XPATH_RANGE 6120#define XPATH_LOCATIONSET 7121/** DOC_ENABLE */122#endif123 124typedef struct _xmlXPathObject xmlXPathObject;125typedef xmlXPathObject *xmlXPathObjectPtr;126struct _xmlXPathObject {127 xmlXPathObjectType type;128 xmlNodeSetPtr nodesetval;129 int boolval;130 double floatval;131 xmlChar *stringval;132 void *user;133 int index;134 void *user2;135 int index2;136};137 138/**139 * xmlXPathConvertFunc:140 * @obj: an XPath object141 * @type: the number of the target type142 *143 * A conversion function is associated to a type and used to cast144 * the new type to primitive values.145 *146 * Returns -1 in case of error, 0 otherwise147 */148typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type);149 150/*151 * Extra type: a name and a conversion function.152 */153 154typedef struct _xmlXPathType xmlXPathType;155typedef xmlXPathType *xmlXPathTypePtr;156struct _xmlXPathType {157 const xmlChar *name; /* the type name */158 xmlXPathConvertFunc func; /* the conversion function */159};160 161/*162 * Extra variable: a name and a value.163 */164 165typedef struct _xmlXPathVariable xmlXPathVariable;166typedef xmlXPathVariable *xmlXPathVariablePtr;167struct _xmlXPathVariable {168 const xmlChar *name; /* the variable name */169 xmlXPathObjectPtr value; /* the value */170};171 172/**173 * xmlXPathEvalFunc:174 * @ctxt: an XPath parser context175 * @nargs: the number of arguments passed to the function176 *177 * An XPath evaluation function, the parameters are on the XPath context stack.178 */179 180typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt,181 int nargs);182 183/*184 * Extra function: a name and a evaluation function.185 */186 187typedef struct _xmlXPathFunct xmlXPathFunct;188typedef xmlXPathFunct *xmlXPathFuncPtr;189struct _xmlXPathFunct {190 const xmlChar *name; /* the function name */191 xmlXPathEvalFunc func; /* the evaluation function */192};193 194/**195 * xmlXPathAxisFunc:196 * @ctxt: the XPath interpreter context197 * @cur: the previous node being explored on that axis198 *199 * An axis traversal function. To traverse an axis, the engine calls200 * the first time with cur == NULL and repeat until the function returns201 * NULL indicating the end of the axis traversal.202 *203 * Returns the next node in that axis or NULL if at the end of the axis.204 */205 206typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt,207 xmlXPathObjectPtr cur);208 209/*210 * Extra axis: a name and an axis function.211 */212 213typedef struct _xmlXPathAxis xmlXPathAxis;214typedef xmlXPathAxis *xmlXPathAxisPtr;215struct _xmlXPathAxis {216 const xmlChar *name; /* the axis name */217 xmlXPathAxisFunc func; /* the search function */218};219 220/**221 * xmlXPathFunction:222 * @ctxt: the XPath interprestation context223 * @nargs: the number of arguments224 *225 * An XPath function.226 * The arguments (if any) are popped out from the context stack227 * and the result is pushed on the stack.228 */229 230typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs);231 232/*233 * Function and Variable Lookup.234 */235 236/**237 * xmlXPathVariableLookupFunc:238 * @ctxt: an XPath context239 * @name: name of the variable240 * @ns_uri: the namespace name hosting this variable241 *242 * Prototype for callbacks used to plug variable lookup in the XPath243 * engine.244 *245 * Returns the XPath object value or NULL if not found.246 */247typedef xmlXPathObjectPtr (*xmlXPathVariableLookupFunc) (void *ctxt,248 const xmlChar *name,249 const xmlChar *ns_uri);250 251/**252 * xmlXPathFuncLookupFunc:253 * @ctxt: an XPath context254 * @name: name of the function255 * @ns_uri: the namespace name hosting this function256 *257 * Prototype for callbacks used to plug function lookup in the XPath258 * engine.259 *260 * Returns the XPath function or NULL if not found.261 */262typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt,263 const xmlChar *name,264 const xmlChar *ns_uri);265 266/**267 * xmlXPathFlags:268 * Flags for XPath engine compilation and runtime269 */270/**271 * XML_XPATH_CHECKNS:272 *273 * check namespaces at compilation274 */275#define XML_XPATH_CHECKNS (1<<0)276/**277 * XML_XPATH_NOVAR:278 *279 * forbid variables in expression280 */281#define XML_XPATH_NOVAR (1<<1)282 283/**284 * xmlXPathContext:285 *286 * Expression evaluation occurs with respect to a context.287 * he context consists of:288 * - a node (the context node)289 * - a node list (the context node list)290 * - a set of variable bindings291 * - a function library292 * - the set of namespace declarations in scope for the expression293 * Following the switch to hash tables, this need to be trimmed up at294 * the next binary incompatible release.295 * The node may be modified when the context is passed to libxml2296 * for an XPath evaluation so you may need to initialize it again297 * before the next call.298 */299 300struct _xmlXPathContext {301 xmlDocPtr doc; /* The current document */302 xmlNodePtr node; /* The current node */303 304 int nb_variables_unused; /* unused (hash table) */305 int max_variables_unused; /* unused (hash table) */306 xmlHashTablePtr varHash; /* Hash table of defined variables */307 308 int nb_types; /* number of defined types */309 int max_types; /* max number of types */310 xmlXPathTypePtr types; /* Array of defined types */311 312 int nb_funcs_unused; /* unused (hash table) */313 int max_funcs_unused; /* unused (hash table) */314 xmlHashTablePtr funcHash; /* Hash table of defined funcs */315 316 int nb_axis; /* number of defined axis */317 int max_axis; /* max number of axis */318 xmlXPathAxisPtr axis; /* Array of defined axis */319 320 /* the namespace nodes of the context node */321 xmlNsPtr *namespaces; /* Array of namespaces */322 int nsNr; /* number of namespace in scope */323 void *user; /* function to free */324 325 /* extra variables */326 int contextSize; /* the context size */327 int proximityPosition; /* the proximity position */328 329 /* extra stuff for XPointer */330 int xptr; /* is this an XPointer context? */331 xmlNodePtr here; /* for here() */332 xmlNodePtr origin; /* for origin() */333 334 /* the set of namespace declarations in scope for the expression */335 xmlHashTablePtr nsHash; /* The namespaces hash table */336 xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */337 void *varLookupData; /* variable lookup data */338 339 /* Possibility to link in an extra item */340 void *extra; /* needed for XSLT */341 342 /* The function name and URI when calling a function */343 const xmlChar *function;344 const xmlChar *functionURI;345 346 /* function lookup function and data */347 xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */348 void *funcLookupData; /* function lookup data */349 350 /* temporary namespace lists kept for walking the namespace axis */351 xmlNsPtr *tmpNsList; /* Array of namespaces */352 int tmpNsNr; /* number of namespaces in scope */353 354 /* error reporting mechanism */355 void *userData; /* user specific data block */356 xmlStructuredErrorFunc error; /* the callback in case of errors */357 xmlError lastError; /* the last error */358 xmlNodePtr debugNode; /* the source node XSLT */359 360 /* dictionary */361 xmlDictPtr dict; /* dictionary if any */362 363 int flags; /* flags to control compilation */364 365 /* Cache for reusal of XPath objects */366 void *cache;367 368 /* Resource limits */369 unsigned long opLimit;370 unsigned long opCount;371 int depth;372};373 374/*375 * The structure of a compiled expression form is not public.376 */377 378typedef struct _xmlXPathCompExpr xmlXPathCompExpr;379typedef xmlXPathCompExpr *xmlXPathCompExprPtr;380 381/**382 * xmlXPathParserContext:383 *384 * An XPath parser context. It contains pure parsing information,385 * an xmlXPathContext, and the stack of objects.386 */387struct _xmlXPathParserContext {388 const xmlChar *cur; /* the current char being parsed */389 const xmlChar *base; /* the full expression */390 391 int error; /* error code */392 393 xmlXPathContextPtr context; /* the evaluation context */394 xmlXPathObjectPtr value; /* the current value */395 int valueNr; /* number of values stacked */396 int valueMax; /* max number of values stacked */397 xmlXPathObjectPtr *valueTab; /* stack of values */398 399 xmlXPathCompExprPtr comp; /* the precompiled expression */400 int xptr; /* it this an XPointer expression */401 xmlNodePtr ancestor; /* used for walking preceding axis */402 403 int valueFrame; /* unused */404};405 406/************************************************************************407 * *408 * Public API *409 * *410 ************************************************************************/411 412/**413 * Objects and Nodesets handling414 */415 416XMLPUBVAR double xmlXPathNAN;417XMLPUBVAR double xmlXPathPINF;418XMLPUBVAR double xmlXPathNINF;419 420/* These macros may later turn into functions */421/**422 * xmlXPathNodeSetGetLength:423 * @ns: a node-set424 *425 * Implement a functionality similar to the DOM NodeList.length.426 *427 * Returns the number of nodes in the node-set.428 */429#define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0)430/**431 * xmlXPathNodeSetItem:432 * @ns: a node-set433 * @index: index of a node in the set434 *435 * Implements a functionality similar to the DOM NodeList.item().436 *437 * Returns the xmlNodePtr at the given @index in @ns or NULL if438 * @index is out of range (0 to length-1)439 */440#define xmlXPathNodeSetItem(ns, index) \441 ((((ns) != NULL) && \442 ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \443 (ns)->nodeTab[(index)] \444 : NULL)445/**446 * xmlXPathNodeSetIsEmpty:447 * @ns: a node-set448 *449 * Checks whether @ns is empty or not.450 *451 * Returns %TRUE if @ns is an empty node-set.452 */453#define xmlXPathNodeSetIsEmpty(ns) \454 (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL))455 456 457XMLPUBFUN void458 xmlXPathFreeObject (xmlXPathObjectPtr obj);459XMLPUBFUN xmlNodeSetPtr460 xmlXPathNodeSetCreate (xmlNodePtr val);461XMLPUBFUN void462 xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj);463XMLPUBFUN void464 xmlXPathFreeNodeSet (xmlNodeSetPtr obj);465XMLPUBFUN xmlXPathObjectPtr466 xmlXPathObjectCopy (xmlXPathObjectPtr val);467XMLPUBFUN int468 xmlXPathCmpNodes (xmlNodePtr node1,469 xmlNodePtr node2);470/**471 * Conversion functions to basic types.472 */473XMLPUBFUN int474 xmlXPathCastNumberToBoolean (double val);475XMLPUBFUN int476 xmlXPathCastStringToBoolean (const xmlChar * val);477XMLPUBFUN int478 xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns);479XMLPUBFUN int480 xmlXPathCastToBoolean (xmlXPathObjectPtr val);481 482XMLPUBFUN double483 xmlXPathCastBooleanToNumber (int val);484XMLPUBFUN double485 xmlXPathCastStringToNumber (const xmlChar * val);486XMLPUBFUN double487 xmlXPathCastNodeToNumber (xmlNodePtr node);488XMLPUBFUN double489 xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns);490XMLPUBFUN double491 xmlXPathCastToNumber (xmlXPathObjectPtr val);492 493XMLPUBFUN xmlChar *494 xmlXPathCastBooleanToString (int val);495XMLPUBFUN xmlChar *496 xmlXPathCastNumberToString (double val);497XMLPUBFUN xmlChar *498 xmlXPathCastNodeToString (xmlNodePtr node);499XMLPUBFUN xmlChar *500 xmlXPathCastNodeSetToString (xmlNodeSetPtr ns);501XMLPUBFUN xmlChar *502 xmlXPathCastToString (xmlXPathObjectPtr val);503 504XMLPUBFUN xmlXPathObjectPtr505 xmlXPathConvertBoolean (xmlXPathObjectPtr val);506XMLPUBFUN xmlXPathObjectPtr507 xmlXPathConvertNumber (xmlXPathObjectPtr val);508XMLPUBFUN xmlXPathObjectPtr509 xmlXPathConvertString (xmlXPathObjectPtr val);510 511/**512 * Context handling.513 */514XMLPUBFUN xmlXPathContextPtr515 xmlXPathNewContext (xmlDocPtr doc);516XMLPUBFUN void517 xmlXPathFreeContext (xmlXPathContextPtr ctxt);518XMLPUBFUN int519 xmlXPathContextSetCache(xmlXPathContextPtr ctxt,520 int active,521 int value,522 int options);523/**524 * Evaluation functions.525 */526XMLPUBFUN long527 xmlXPathOrderDocElems (xmlDocPtr doc);528XMLPUBFUN int529 xmlXPathSetContextNode (xmlNodePtr node,530 xmlXPathContextPtr ctx);531XMLPUBFUN xmlXPathObjectPtr532 xmlXPathNodeEval (xmlNodePtr node,533 const xmlChar *str,534 xmlXPathContextPtr ctx);535XMLPUBFUN xmlXPathObjectPtr536 xmlXPathEval (const xmlChar *str,537 xmlXPathContextPtr ctx);538XMLPUBFUN xmlXPathObjectPtr539 xmlXPathEvalExpression (const xmlChar *str,540 xmlXPathContextPtr ctxt);541XMLPUBFUN int542 xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,543 xmlXPathObjectPtr res);544/**545 * Separate compilation/evaluation entry points.546 */547XMLPUBFUN xmlXPathCompExprPtr548 xmlXPathCompile (const xmlChar *str);549XMLPUBFUN xmlXPathCompExprPtr550 xmlXPathCtxtCompile (xmlXPathContextPtr ctxt,551 const xmlChar *str);552XMLPUBFUN xmlXPathObjectPtr553 xmlXPathCompiledEval (xmlXPathCompExprPtr comp,554 xmlXPathContextPtr ctx);555XMLPUBFUN int556 xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,557 xmlXPathContextPtr ctxt);558XMLPUBFUN void559 xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);560#endif /* LIBXML_XPATH_ENABLED */561#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)562XML_DEPRECATED563XMLPUBFUN void564 xmlXPathInit (void);565XMLPUBFUN int566 xmlXPathIsNaN (double val);567XMLPUBFUN int568 xmlXPathIsInf (double val);569 570#ifdef __cplusplus571}572#endif573 574#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*/575#endif /* ! __XML_XPATH_H__ */576 