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

📄 xmlreader.c

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 *          nodes to read, or -1 in case of error */intxmlTextReaderNextSibling(xmlTextReaderPtr reader) {    if (reader == NULL)        return(-1);    if (reader->doc == NULL) {        /* TODO */	return(-1);    }    if (reader->state == XML_TEXTREADER_END)        return(0);    if (reader->node == NULL)        return(xmlTextReaderNextTree(reader));    if (reader->node->next != NULL) {        reader->node = reader->node->next;        reader->state = XML_TEXTREADER_START;        return(1);    }    return(0);}/************************************************************************ *									* *			Constructor and destructors			* *									* ************************************************************************//** * xmlNewTextReader: * @input: the xmlParserInputBufferPtr used to read data * @URI: the URI information for the source if available * * Create an xmlTextReader structure fed with @input * * Returns the new xmlTextReaderPtr or NULL in case of error */xmlTextReaderPtrxmlNewTextReader(xmlParserInputBufferPtr input, const char *URI) {    xmlTextReaderPtr ret;    if (input == NULL)	return(NULL);    ret = xmlMalloc(sizeof(xmlTextReader));    if (ret == NULL) {        xmlGenericError(xmlGenericErrorContext,		"xmlNewTextReader : malloc failed\n");	return(NULL);    }    memset(ret, 0, sizeof(xmlTextReader));    ret->doc = NULL;    ret->entTab = NULL;    ret->entMax = 0;    ret->entNr = 0;    ret->input = input;    ret->buffer = xmlBufferCreateSize(100);    if (ret->buffer == NULL) {        xmlFree(ret);        xmlGenericError(xmlGenericErrorContext,		"xmlNewTextReader : malloc failed\n");	return(NULL);    }    ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));    if (ret->sax == NULL) {	xmlBufferFree(ret->buffer);	xmlFree(ret);        xmlGenericError(xmlGenericErrorContext,		"xmlNewTextReader : malloc failed\n");	return(NULL);    }    xmlSAXVersion(ret->sax, 2);    ret->startElement = ret->sax->startElement;    ret->sax->startElement = xmlTextReaderStartElement;    ret->endElement = ret->sax->endElement;    ret->sax->endElement = xmlTextReaderEndElement;#ifdef LIBXML_SAX1_ENABLED    if (ret->sax->initialized == XML_SAX2_MAGIC) {#endif /* LIBXML_SAX1_ENABLED */	ret->startElementNs = ret->sax->startElementNs;	ret->sax->startElementNs = xmlTextReaderStartElementNs;	ret->endElementNs = ret->sax->endElementNs;	ret->sax->endElementNs = xmlTextReaderEndElementNs;#ifdef LIBXML_SAX1_ENABLED    } else {	ret->startElementNs = NULL;	ret->endElementNs = NULL;    }#endif /* LIBXML_SAX1_ENABLED */    ret->characters = ret->sax->characters;    ret->sax->characters = xmlTextReaderCharacters;    ret->sax->ignorableWhitespace = xmlTextReaderCharacters;    ret->cdataBlock = ret->sax->cdataBlock;    ret->sax->cdataBlock = xmlTextReaderCDataBlock;    ret->mode = XML_TEXTREADER_MODE_INITIAL;    ret->node = NULL;    ret->curnode = NULL;    if (ret->input->buffer->use < 4) {	xmlParserInputBufferRead(input, 4);    }    if (ret->input->buffer->use >= 4) {	ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL,			(const char *) ret->input->buffer->content, 4, URI);	ret->base = 0;	ret->cur = 4;    } else {	ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI);	ret->base = 0;	ret->cur = 0;    }        if (ret->ctxt == NULL) {        xmlGenericError(xmlGenericErrorContext,		"xmlNewTextReader : malloc failed\n");	xmlBufferFree(ret->buffer);	xmlFree(ret->sax);	xmlFree(ret);	return(NULL);    }    ret->ctxt->parseMode = XML_PARSE_READER;    ret->ctxt->_private = ret;    ret->ctxt->linenumbers = 1;    ret->ctxt->dictNames = 1;    ret->allocs = XML_TEXTREADER_CTXT;    /*     * use the parser dictionnary to allocate all elements and attributes names     */    ret->ctxt->docdict = 1;    ret->dict = ret->ctxt->dict;#ifdef LIBXML_XINCLUDE_ENABLED    ret->xinclude = 0;#endif#ifdef LIBXML_PATTERN_ENABLED    ret->patternMax = 0;    ret->patternTab = NULL;#endif    return(ret);}/** * xmlNewTextReaderFilename: * @URI: the URI of the resource to process * * Create an xmlTextReader structure fed with the resource at @URI * * Returns the new xmlTextReaderPtr or NULL in case of error */xmlTextReaderPtrxmlNewTextReaderFilename(const char *URI) {    xmlParserInputBufferPtr input;    xmlTextReaderPtr ret;    char *directory = NULL;    input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE);    if (input == NULL)	return(NULL);    ret = xmlNewTextReader(input, URI);    if (ret == NULL) {	xmlFreeParserInputBuffer(input);	return(NULL);    }    ret->allocs |= XML_TEXTREADER_INPUT;    if (ret->ctxt->directory == NULL)        directory = xmlParserGetDirectory(URI);    if ((ret->ctxt->directory == NULL) && (directory != NULL))        ret->ctxt->directory = (char *) xmlStrdup((xmlChar *) directory);    if (directory != NULL)	xmlFree(directory);    return(ret);}/** * xmlFreeTextReader: * @reader:  the xmlTextReaderPtr * * Deallocate all the resources associated to the reader */voidxmlFreeTextReader(xmlTextReaderPtr reader) {    if (reader == NULL)	return;#ifdef LIBXML_SCHEMAS_ENABLED    if (reader->rngSchemas != NULL) {	xmlRelaxNGFree(reader->rngSchemas);	reader->rngSchemas = NULL;    }    if (reader->rngValidCtxt != NULL) {	xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt);	reader->rngValidCtxt = NULL;    }    if (reader->xsdPlug != NULL) {	xmlSchemaSAXUnplug(reader->xsdPlug);	reader->xsdPlug = NULL;    }    if (reader->xsdValidCtxt != NULL) {	if (! reader->xsdPreserveCtxt)	    xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);	reader->xsdValidCtxt = NULL;    }    if (reader->xsdSchemas != NULL) {	xmlSchemaFree(reader->xsdSchemas);	reader->xsdSchemas = NULL;    }#endif#ifdef LIBXML_XINCLUDE_ENABLED    if (reader->xincctxt != NULL)	xmlXIncludeFreeContext(reader->xincctxt);#endif#ifdef LIBXML_PATTERN_ENABLED    if (reader->patternTab != NULL) {        int i;	for (i = 0;i < reader->patternNr;i++) {	    if (reader->patternTab[i] != NULL)	        xmlFreePattern(reader->patternTab[i]);	}	xmlFree(reader->patternTab);    }#endif    if (reader->ctxt != NULL) {        if (reader->dict == reader->ctxt->dict)	    reader->dict = NULL;	if (reader->ctxt->myDoc != NULL) {	    if (reader->preserve == 0)		xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc);	    reader->ctxt->myDoc = NULL;	}	if ((reader->ctxt->vctxt.vstateTab != NULL) &&	    (reader->ctxt->vctxt.vstateMax > 0)){	    xmlFree(reader->ctxt->vctxt.vstateTab);	    reader->ctxt->vctxt.vstateTab = NULL;	    reader->ctxt->vctxt.vstateMax = 0;	}	if (reader->allocs & XML_TEXTREADER_CTXT)	    xmlFreeParserCtxt(reader->ctxt);    }    if (reader->sax != NULL)	xmlFree(reader->sax);    if ((reader->input != NULL)  && (reader->allocs & XML_TEXTREADER_INPUT))	xmlFreeParserInputBuffer(reader->input);    if (reader->faketext != NULL) {	xmlFreeNode(reader->faketext);    }    if (reader->buffer != NULL)        xmlBufferFree(reader->buffer);    if (reader->entTab != NULL)	xmlFree(reader->entTab);    if (reader->dict != NULL)        xmlDictFree(reader->dict);    xmlFree(reader);}/************************************************************************ *									* *			Methods for XmlTextReader			* *									* ************************************************************************//** * xmlTextReaderClose: * @reader:  the xmlTextReaderPtr used * * This method releases any resources allocated by the current instance * changes the state to Closed and close any underlying input. * * Returns 0 or -1 in case of error */intxmlTextReaderClose(xmlTextReaderPtr reader) {    if (reader == NULL)	return(-1);    reader->node = NULL;    reader->curnode = NULL;    reader->mode = XML_TEXTREADER_MODE_CLOSED;    if (reader->ctxt != NULL) {	xmlStopParser(reader->ctxt);	if (reader->ctxt->myDoc != NULL) {	    if (reader->preserve == 0)		xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc);	    reader->ctxt->myDoc = NULL;	}    }    if ((reader->input != NULL)  && (reader->allocs & XML_TEXTREADER_INPUT)) {	xmlFreeParserInputBuffer(reader->input);	reader->allocs -= XML_TEXTREADER_INPUT;    }    return(0);}/** * xmlTextReaderGetAttributeNo: * @reader:  the xmlTextReaderPtr used * @no: the zero-based index of the attribute relative to the containing element * * Provides the value of the attri

⌨️ 快捷键说明

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