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

📄 xpath.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
		xmlNsPtr ns1, ns2;		ns1 = (xmlNsPtr) val1->nodeTab[j];		ns2 = (xmlNsPtr) val2->nodeTab[i];		if ((ns1->next == ns2->next) &&		    (xmlStrEqual(ns1->prefix, ns2->prefix))) {		    skip = 1;		    break;		}	    }	}	if (skip)	    continue;	/*	 * grow the nodeTab if needed	 */	if (val1->nodeMax == 0) {	    val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *						    sizeof(xmlNodePtr));	    if (val1->nodeTab == NULL) {	        xmlXPathErrMemory(NULL, "merging nodeset\n");		return(NULL);	    }	    memset(val1->nodeTab, 0 ,		   XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));	    val1->nodeMax = XML_NODESET_DEFAULT;	} else if (val1->nodeNr == val1->nodeMax) {	    xmlNodePtr *temp;	    val1->nodeMax *= 2;	    temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax *					     sizeof(xmlNodePtr));	    if (temp == NULL) {	        xmlXPathErrMemory(NULL, "merging nodeset\n");		return(NULL);	    }	    val1->nodeTab = temp;	}	if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) {	    xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i];	    val1->nodeTab[val1->nodeNr++] =		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);	} else	    val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i];    }    return(val1);}/** * xmlXPathNodeSetMergeUnique: * @val1:  the first NodeSet or NULL * @val2:  the second NodeSet * * Merges two nodesets, all nodes from @val2 are added to @val1 * if @val1 is NULL, a new set is created and copied from @val2 * * Returns @val1 once extended or NULL in case of error. */static xmlNodeSetPtrxmlXPathNodeSetMergeUnique(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {    int i;    if (val2 == NULL) return(val1);    if (val1 == NULL) {	val1 = xmlXPathNodeSetCreate(NULL);    }    /* @@ with_ns to check whether namespace nodes should be looked at @@ */    for (i = 0;i < val2->nodeNr;i++) {	/*	 * grow the nodeTab if needed	 */	if (val1->nodeMax == 0) {	    val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *						    sizeof(xmlNodePtr));	    if (val1->nodeTab == NULL) {	        xmlXPathErrMemory(NULL, "merging nodeset\n");		return(NULL);	    }	    memset(val1->nodeTab, 0 ,		   XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));	    val1->nodeMax = XML_NODESET_DEFAULT;	} else if (val1->nodeNr == val1->nodeMax) {	    xmlNodePtr *temp;	    val1->nodeMax *= 2;	    temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax *					     sizeof(xmlNodePtr));	    if (temp == NULL) {	        xmlXPathErrMemory(NULL, "merging nodeset\n");		return(NULL);	    }	    val1->nodeTab = temp;	}	if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) {	    xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i];	    val1->nodeTab[val1->nodeNr++] =		xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);	} else	    val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i];    }    return(val1);}/** * xmlXPathNodeSetDel: * @cur:  the initial node set * @val:  an xmlNodePtr * * Removes an xmlNodePtr from an existing NodeSet */voidxmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) {    int i;    if (cur == NULL) return;    if (val == NULL) return;    /*     * find node in nodeTab     */    for (i = 0;i < cur->nodeNr;i++)        if (cur->nodeTab[i] == val) break;    if (i >= cur->nodeNr) {	/* not found */#ifdef DEBUG        xmlGenericError(xmlGenericErrorContext, 	        "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n",		val->name);#endif        return;    }    if ((cur->nodeTab[i] != NULL) &&	(cur->nodeTab[i]->type == XML_NAMESPACE_DECL))	xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]);    cur->nodeNr--;    for (;i < cur->nodeNr;i++)        cur->nodeTab[i] = cur->nodeTab[i + 1];    cur->nodeTab[cur->nodeNr] = NULL;}/** * xmlXPathNodeSetRemove: * @cur:  the initial node set * @val:  the index to remove * * Removes an entry from an existing NodeSet list. */voidxmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) {    if (cur == NULL) return;    if (val >= cur->nodeNr) return;    if ((cur->nodeTab[val] != NULL) &&	(cur->nodeTab[val]->type == XML_NAMESPACE_DECL))	xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]);    cur->nodeNr--;    for (;val < cur->nodeNr;val++)        cur->nodeTab[val] = cur->nodeTab[val + 1];    cur->nodeTab[cur->nodeNr] = NULL;}/** * xmlXPathFreeNodeSet: * @obj:  the xmlNodeSetPtr to free * * Free the NodeSet compound (not the actual nodes !). */voidxmlXPathFreeNodeSet(xmlNodeSetPtr obj) {    if (obj == NULL) return;    if (obj->nodeTab != NULL) {	int i;	/* @@ with_ns to check whether namespace nodes should be looked at @@ */	for (i = 0;i < obj->nodeNr;i++)	    if ((obj->nodeTab[i] != NULL) &&		(obj->nodeTab[i]->type == XML_NAMESPACE_DECL))		xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]);	xmlFree(obj->nodeTab);    }    xmlFree(obj);}/** * xmlXPathFreeValueTree: * @obj:  the xmlNodeSetPtr to free * * Free the NodeSet compound and the actual tree, this is different * from xmlXPathFreeNodeSet() */static voidxmlXPathFreeValueTree(xmlNodeSetPtr obj) {    int i;    if (obj == NULL) return;    if (obj->nodeTab != NULL) {	for (i = 0;i < obj->nodeNr;i++) {	    if (obj->nodeTab[i] != NULL) {		if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) {		    xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]);		} else {		    xmlFreeNodeList(obj->nodeTab[i]);		}	    }	}	xmlFree(obj->nodeTab);    }    xmlFree(obj);}#if defined(DEBUG) || defined(DEBUG_STEP)/** * xmlGenericErrorContextNodeSet: * @output:  a FILE * for the output * @obj:  the xmlNodeSetPtr to display * * Quick display of a NodeSet */voidxmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) {    int i;    if (output == NULL) output = xmlGenericErrorContext;    if (obj == NULL)  {        fprintf(output, "NodeSet == NULL !\n");	return;    }    if (obj->nodeNr == 0) {        fprintf(output, "NodeSet is empty\n");	return;    }    if (obj->nodeTab == NULL) {	fprintf(output, " nodeTab == NULL !\n");	return;    }    for (i = 0; i < obj->nodeNr; i++) {        if (obj->nodeTab[i] == NULL) {	    fprintf(output, " NULL !\n");	    return;        }	if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) ||	    (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE))	    fprintf(output, " /");	else if (obj->nodeTab[i]->name == NULL)	    fprintf(output, " noname!");	else fprintf(output, " %s", obj->nodeTab[i]->name);    }    fprintf(output, "\n");}#endif/** * xmlXPathNewNodeSet: * @val:  the NodePtr value * * Create a new xmlXPathObjectPtr of type NodeSet and initialize * it with the single Node @val * * Returns the newly created object. */xmlXPathObjectPtrxmlXPathNewNodeSet(xmlNodePtr val) {    xmlXPathObjectPtr ret;    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));    if (ret == NULL) {        xmlXPathErrMemory(NULL, "creating nodeset\n");	return(NULL);    }    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));    ret->type = XPATH_NODESET;    ret->boolval = 0;    ret->nodesetval = xmlXPathNodeSetCreate(val);    /* @@ with_ns to check whether namespace nodes should be looked at @@ */    return(ret);}/** * xmlXPathNewValueTree: * @val:  the NodePtr value * * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize * it with the tree root @val * * Returns the newly created object. */xmlXPathObjectPtrxmlXPathNewValueTree(xmlNodePtr val) {    xmlXPathObjectPtr ret;    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));    if (ret == NULL) {        xmlXPathErrMemory(NULL, "creating result value tree\n");	return(NULL);    }    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));    ret->type = XPATH_XSLT_TREE;    ret->boolval = 1;    ret->user = (void *) val;    ret->nodesetval = xmlXPathNodeSetCreate(val);    return(ret);}/** * xmlXPathNewNodeSetList: * @val:  an existing NodeSet * * Create a new xmlXPathObjectPtr of type NodeSet and initialize * it with the Nodeset @val * * Returns the newly created object. */xmlXPathObjectPtrxmlXPathNewNodeSetList(xmlNodeSetPtr val){    xmlXPathObjectPtr ret;    int i;    if (val == NULL)        ret = NULL;    else if (val->nodeTab == NULL)        ret = xmlXPathNewNodeSet(NULL);    else {        ret = xmlXPathNewNodeSet(val->nodeTab[0]);        for (i = 1; i < val->nodeNr; ++i)            xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]);    }    return (ret);}/** * xmlXPathWrapNodeSet: * @val:  the NodePtr value * * Wrap the Nodeset @val in a new xmlXPathObjectPtr * * Returns the newly created object. */xmlXPathObjectPtrxmlXPathWrapNodeSet(xmlNodeSetPtr val) {    xmlXPathObjectPtr ret;    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));    if (ret == NULL) {        xmlXPathErrMemory(NULL, "creating node set object\n");	return(NULL);    }    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));    ret->type = XPATH_NODESET;    ret->nodesetval = val;    return(ret);}/** * xmlXPathFreeNodeSetList: * @obj:  an existing NodeSetList object * * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in * the list contrary to xmlXPathFreeObject(). */voidxmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) {    if (obj == NULL) return;    xmlFree(obj);}/** * xmlXPathDifference: * @nodes1:  a node-set * @nodes2:  a node-set * * Implements the EXSLT - Sets difference() function: *    node-set set:difference (node-set, node-set) * * Returns the difference between the two node sets, or nodes1 if *         nodes2 is empty */xmlNodeSetPtrxmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {    xmlNodeSetPtr ret;    int i, l1;    xmlNodePtr cur;    if (xmlXPathNodeSetIsEmpty(nodes2))	return(nodes1);    ret = xmlXPathNodeSetCreate(NULL);    if (xmlXPathNodeSetIsEmpty(nodes1))	return(ret);    l1 = xmlXPathNodeSetGetLength(nodes1);    for (i = 0; i < l1; i++) {	cur = xmlXPathNodeSetItem(nodes1, i);	if (!xmlXPathNodeSetContains(nodes2, cur))	    xmlXPathNodeSetAddUnique(ret, cur);    }    return(ret);}/** * xmlXPathIntersection: * @nodes1:  a node-set * @nodes2:  a node-set * * Implements the EXSLT - Sets intersection() function: *    node-set set:intersection (node-set, node-set) * * Returns a node set comprising the nodes that are within both the *         node sets passed as arguments */xmlNodeSetPtrxmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {    xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL);    int i, l1;    xmlNodePtr cur;    if (xmlXPathNodeSetIsEmpty(nodes1))	return(ret);    if (xmlXPathNodeSetIsEmpty(nodes2))	return(ret);    l1 = xmlXPathNodeSetGetLength(nodes1);    for (i = 0; i < l1; i++) {	cur = xmlXPathNodeSetItem(nodes1, i);	if (xmlXPathNodeSetContains(nodes2, cur))	    xmlXPathNodeSetAddUnique(ret, cur);    }    return(ret);}/** * xmlXPathDistinctSorted: * @nodes:  a node-set, sorted by document order * * Implements the EXSLT - Sets distinct() function: *    node-set set:distinct (node-set) *  * Returns a subset of the nodes contained in @nodes, or @nodes if *         it is empty */xmlNodeSetPtrxmlXPathDistinctSorted (xmlNodeSetPtr nodes) {    xmlNodeSetPtr ret;    xmlHashTablePtr hash;    int i, l;    xmlChar * strval;    xmlNodePtr cur;    if (xmlXPathNodeSetIsEmpty(nodes))	return(nodes);    ret = xmlXPathNodeSetCreate(NULL);    l = xmlXPathNodeSetGetLength(nodes);    hash = xmlHashCreate (l);    for (i = 0; i < l; i++) {	cur = xmlXPathNodeSetItem(nodes, i);	strval = xmlXPathCastNodeToString(cur);	if (xmlHashLookup(hash, strval) == NULL) {	    xmlHashAddEntry(hash, strval, strval);	    xmlXPathNodeSetAddUnique(ret, cur);	} else {	    xmlFree(strval);	}    }    xmlHashFree(hash, (xmlHashDeallocator) xmlFree);    return(ret);}/** * xmlXPathDistinct: * @nodes:  a node-set * * Implements the EXSLT - Sets distinct() function: *    node-set set:distinct (node-set) * @nodes is sorted by document order, then #exslSetsDistinctSorted * is called with the sorted node-set * * Returns a subset of the nodes contained in @nodes, or @nodes if *         it is empty */xmlNodeSetPtrxmlXPathDistinct (xmlNodeSetPtr nodes) {    if (xmlXPathNodeSetIsEmpty(nodes))	return(nodes);    xmlXPathNodeSetSort(nodes);    return(xmlXPathDistinctSorted(nodes));}/** * xmlXPathHasSameNodes: * @nodes1:  a node-set * @nodes2:  a node-set * * Implements the EXSLT - Sets

⌨️ 快捷键说明

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