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

📄 xmlreader.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
	goto node_end;    }    if ((reader->preserves == 0) &&#ifdef LIBXML_XINCLUDE_ENABLED        (reader->in_xinclude == 0) &&#endif	(reader->entNr == 0) &&        (reader->node->last != NULL) &&        ((reader->node->last->extra & NODE_IS_PRESERVED) == 0)) {	xmlNodePtr tmp = reader->node->last;	xmlUnlinkNode(tmp);	xmlTextReaderFreeNode(reader, tmp);    }    reader->depth--;    reader->state = XML_TEXTREADER_BACKTRACK;node_found:    DUMP_READER    /*     * If we are in the middle of a piece of CDATA make sure it's finished     */    if ((reader->node != NULL) &&        (reader->node->next == NULL) &&        ((reader->node->type == XML_TEXT_NODE) ||	 (reader->node->type == XML_CDATA_SECTION_NODE))) {            xmlTextReaderExpand(reader);    }#ifdef LIBXML_XINCLUDE_ENABLED    /*     * Handle XInclude if asked for     */    if ((reader->xinclude) && (reader->node != NULL) &&	(reader->node->type == XML_ELEMENT_NODE) &&	(reader->node->ns != NULL) &&	((xmlStrEqual(reader->node->ns->href, XINCLUDE_NS)) ||	 (xmlStrEqual(reader->node->ns->href, XINCLUDE_OLD_NS)))) {	if (reader->xincctxt == NULL) {	    reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc);	    xmlXIncludeSetFlags(reader->xincctxt, reader->parserFlags);	}	/*	 * expand that node and process it	 */	xmlTextReaderExpand(reader);	xmlXIncludeProcessNode(reader->xincctxt, reader->node);    }    if (reader->node->type == XML_XINCLUDE_START) {        reader->in_xinclude++;	goto get_next_node;    }     if (reader->node->type == XML_XINCLUDE_END) {        reader->in_xinclude--;	goto get_next_node;    }#endif    /*     * Handle entities enter and exit when in entity replacement mode     */    if ((reader->node != NULL) &&	(reader->node->type == XML_ENTITY_REF_NODE) &&	(reader->ctxt != NULL) && (reader->ctxt->replaceEntities == 1)) {	/*	 * Case where the underlying tree is not availble, lookup the entity	 * and walk it.	 */	if ((reader->node->children == NULL) && (reader->ctxt->sax != NULL) &&	    (reader->ctxt->sax->getEntity != NULL)) {	    reader->node->children = (xmlNodePtr) 		reader->ctxt->sax->getEntity(reader->ctxt, reader->node->name);	}	if ((reader->node->children != NULL) &&	    (reader->node->children->type == XML_ENTITY_DECL) &&	    (reader->node->children->children != NULL)) {	    xmlTextReaderEntPush(reader, reader->node);	    reader->node = reader->node->children->children;	}#ifdef LIBXML_REGEXP_ENABLED    } else if ((reader->node != NULL) &&	       (reader->node->type == XML_ENTITY_REF_NODE) &&	       (reader->ctxt != NULL) && (reader->validate)) {	xmlTextReaderValidateEntity(reader);#endif /* LIBXML_REGEXP_ENABLED */    }    if ((reader->node != NULL) &&	(reader->node->type == XML_ENTITY_DECL) &&	(reader->ent != NULL) && (reader->ent->children == reader->node)) {	reader->node = xmlTextReaderEntPop(reader);	reader->depth++;        goto get_next_node;    }#ifdef LIBXML_REGEXP_ENABLED    if ((reader->validate) && (reader->node != NULL)) {	xmlNodePtr node = reader->node;	if ((node->type == XML_ELEMENT_NODE) &&             ((reader->state != XML_TEXTREADER_END) &&	     (reader->state != XML_TEXTREADER_BACKTRACK))) {	    xmlTextReaderValidatePush(reader);	} else if ((node->type == XML_TEXT_NODE) ||		   (node->type == XML_CDATA_SECTION_NODE)) {            xmlTextReaderValidateCData(reader, node->content,	                               xmlStrlen(node->content));	}    }#endif /* LIBXML_REGEXP_ENABLED */#ifdef LIBXML_PATTERN_ENABLED    if ((reader->patternNr > 0) && (reader->state != XML_TEXTREADER_END) &&        (reader->state != XML_TEXTREADER_BACKTRACK)) {        int i;	for (i = 0;i < reader->patternNr;i++) {	     if (xmlPatternMatch(reader->patternTab[i], reader->node) == 1) {	         xmlTextReaderPreserve(reader);		 break;             }	}    }#endif /* LIBXML_PATTERN_ENABLED */    return(1);node_end:    reader->mode = XML_TEXTREADER_DONE;    return(0);}/** * xmlTextReaderReadState: * @reader:  the xmlTextReaderPtr used * * Gets the read state of the reader. * * Returns the state value, or -1 in case of error */intxmlTextReaderReadState(xmlTextReaderPtr reader) {    if (reader == NULL)	return(-1);    return(reader->mode);}/** * xmlTextReaderExpand: * @reader:  the xmlTextReaderPtr used * * Reads the contents of the current node and the full subtree. It then makes * the subtree available until the next xmlTextReaderRead() call * * Returns a node pointer valid until the next xmlTextReaderRead() call *         or NULL in case of error. */xmlNodePtrxmlTextReaderExpand(xmlTextReaderPtr reader) {    if ((reader == NULL) || (reader->node == NULL))        return(NULL);    if (reader->doc != NULL)        return(reader->node);    if (reader->ctxt == NULL)        return(NULL);    if (xmlTextReaderDoExpand(reader) < 0)        return(NULL);    return(reader->node);}/** * xmlTextReaderNext: * @reader:  the xmlTextReaderPtr used * * Skip to the node following the current one in document order while * avoiding the subtree if any. * * Returns 1 if the node was read successfully, 0 if there is no more *          nodes to read, or -1 in case of error */intxmlTextReaderNext(xmlTextReaderPtr reader) {    int ret;    xmlNodePtr cur;    if (reader == NULL)	return(-1);    if (reader->doc != NULL)        return(xmlTextReaderNextTree(reader));    cur = reader->node;    if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE))        return(xmlTextReaderRead(reader));    if (reader->state == XML_TEXTREADER_END)        return(xmlTextReaderRead(reader));    if (cur->extra & NODE_IS_EMPTY)        return(xmlTextReaderRead(reader));    do {        ret = xmlTextReaderRead(reader);	if (ret != 1)	    return(ret);    } while (reader->node != cur);    return(xmlTextReaderRead(reader));}/** * xmlTextReaderReadInnerXml: * @reader:  the xmlTextReaderPtr used * * Reads the contents of the current node, including child nodes and markup. * * Returns a string containing the XML content, or NULL if the current node *         is neither an element nor attribute, or has no child nodes. The  *         string must be deallocated by the caller. */xmlChar *xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) {    TODO    return(NULL);}/** * xmlTextReaderReadOuterXml: * @reader:  the xmlTextReaderPtr used * * Reads the contents of the current node, including child nodes and markup. * * Returns a string containing the XML content, or NULL if the current node *         is neither an element nor attribute, or has no child nodes. The  *         string must be deallocated by the caller. */xmlChar *xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) {    TODO    return(NULL);}/** * xmlTextReaderReadString: * @reader:  the xmlTextReaderPtr used * * Reads the contents of an element or a text node as a string. * * Returns a string containing the contents of the Element or Text node, *         or NULL if the reader is positioned on any other type of node. *         The string must be deallocated by the caller. */xmlChar *xmlTextReaderReadString(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) {    TODO    return(NULL);}#if 0/** * xmlTextReaderReadBase64: * @reader:  the xmlTextReaderPtr used * @array:  a byte array to store the content. * @offset:  the zero-based index into array where the method should *           begin to write. * @len:  the number of bytes to write. * * Reads and decodes the Base64 encoded contents of an element and * stores the result in a byte buffer. * * Returns the number of bytes written to array, or zero if the current *         instance is not positioned on an element or -1 in case of error. */intxmlTextReaderReadBase64(xmlTextReaderPtr reader,                        unsigned char *array ATTRIBUTE_UNUSED,	                int offset ATTRIBUTE_UNUSED,			int len ATTRIBUTE_UNUSED) {    if ((reader == NULL) || (reader->ctxt == NULL))	return(-1);    if (reader->ctxt->wellFormed != 1)	return(-1);    if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE))	return(0);    TODO    return(0);}/** * xmlTextReaderReadBinHex: * @reader:  the xmlTextReaderPtr used * @array:  a byte array to store the content. * @offset:  the zero-based index into array where the method should *           begin to write. * @len:  the number of bytes to write. * * Reads and decodes the BinHex encoded contents of an element and * stores the result in a byte buffer. * * Returns the number of bytes written to array, or zero if the current *         instance is not positioned on an element or -1 in case of error. */intxmlTextReaderReadBinHex(xmlTextReaderPtr reader,                        unsigned char *array ATTRIBUTE_UNUSED,	                int offset ATTRIBUTE_UNUSED,			int len ATTRIBUTE_UNUSED) {    if ((reader == NULL) || (reader->ctxt == NULL))	return(-1);    if (reader->ctxt->wellFormed != 1)	return(-1);    if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE))	return(0);    TODO    return(0);}#endif/************************************************************************ *									* *			Operating on a preparsed tree			* *									* ************************************************************************/static intxmlTextReaderNextTree(xmlTextReaderPtr reader){    if (reader == NULL)        return(-1);    if (reader->state == XML_TEXTREADER_END)        return(0);    if (reader->node == NULL) {        if (reader->doc->children == NULL) {            reader->state = XML_TEXTREADER_END;            return(0);        }        reader->node = reader->doc->children;        reader->state = XML_TEXTREADER_START;        return(1);    }    if (reader->state != XML_TEXTREADER_BACKTRACK) {        if (reader->node->children != 0) {            reader->node = reader->node->children;            reader->depth++;            reader->state = XML_TEXTREADER_START;            return(1);        }        if ((reader->node->type == XML_ELEMENT_NODE) ||            (reader->node->type == XML_ATTRIBUTE_NODE)) {            reader->state = XML_TEXTREADER_BACKTRACK;            return(1);        }    }    if (reader->node->next != 0) {        reader->node = reader->node->next;        reader->state = XML_TEXTREADER_START;        return(1);    }    if (reader->node->parent != 0) {        if (reader->node->parent->type == XML_DOCUMENT_NODE) {            reader->state = XML_TEXTREADER_END;            return(0);        }        reader->node = reader->node->parent;        reader->depth--;        reader->state = XML_TEXTREADER_BACKTRACK;        return(1);    }    reader->state = XML_TEXTREADER_END;    return(1);}/** * xmlTextReaderReadTree: * @reader:  the xmlTextReaderPtr used * *  Moves the position of the current instance to the next node in *  the stream, exposing its properties. * *  Returns 1 if the node was read successfully, 0 if there is no more *          nodes to read, or -1 in case of error */static intxmlTextReaderReadTree(xmlTextReaderPtr reader) {    if (reader->state == XML_TEXTREADER_END)        return(0);next_node:    if (reader->node == NULL) {        if (reader->doc->children == NULL) {            reader->state = XML_TEXTREADER_END;            return(0);        }        reader->node = reader->doc->children;        reader->state = XML_TEXTREADER_START;        goto found_node;    }    if ((reader->state != XML_TEXTREADER_BACKTRACK) &&        (reader->node->type != XML_DTD_NODE) &&        (reader->node->type != XML_XINCLUDE_START) &&	(reader->node->type != XML_ENTITY_REF_NODE)) {        if (reader->node->children != NULL) {            reader->node = reader->node->children;            reader->depth++;            reader->state = XML_TEXTREADER_START;            goto found_node;        }        if (reader->node->type == XML_ATTRIBUTE_NODE) {            reader->state = XML_TEXTREADER_BACKTRACK;            goto found_node;        }    }    if (reader->node->next != NULL) {        reader->node = reader->node->next;        reader->state = XML_TEXTREADER_START;        goto found_node;    }    if (reader->node->parent != NULL) {        if ((reader->node->parent->type == XML_DOCUMENT_NODE) ||	    (reader->node->parent->type == XML_HTML_DOCUMENT_NODE)) {            reader->state = XML_TEXTREADER_END;            return(0);        }        reader->node = reader->node->parent;        reader->depth--;        reader->state = XML_TEXTREADER_BACKTRACK;        goto found_node;    }    reader->state = XML_TEXTREADER_END;found_node:    if ((reader->node->type == XML_XINCLUDE_START) ||        (reader->node->type == XML_XINCLUDE_END))	goto next_node;    return(1);}/** * xmlTextReaderNextSibling: * @reader:  the xmlTextReaderPtr used * * Skip to the node following the current one in document order while * avoiding the subtree if any. * Currently implemented only for Readers built on a document * * Returns 1 if the node was read successfully, 0 if there is no more

⌨️ 快捷键说明

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