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

📄 xmlreader.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
 *          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);    ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));    if (ret->sax == NULL) {	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");	xmlFree(ret->sax);	xmlFree(ret);	return(NULL);    }    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;    }#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 = 0;	    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 attribute with the specified index relative * to the containing element. * * Returns a string containing the value of the specified attribute, or NULL *    in case of error. The string must be deallocated by the caller. */xmlChar *xmlTextReaderGetAttributeNo(xmlTextReaderPtr reader, int no) {    xmlChar *ret;    int i;    xmlAttrPtr cur;    xmlNsPtr ns;    if (reader == NULL)	return(NULL);    if (reader->node == NULL)	return(NULL);    if (reader->curnode != NULL)	return(NULL);    /* TODO: handle the xmlDecl */    if (reader->node->type != XML_ELEMENT_NODE) 	return(NULL);    ns = reader->node->nsDef;    for (i = 0;(i < no) && (ns != NULL);i++) {	ns = ns->next;    }    if (ns != NULL)	return(xmlStrdup(ns->href));    cur = reader->node->properties;    if (cur == NULL)	return(NULL);    for (;i < no;i++) {	cur = cur->next;	if (cur == NULL)	    return(NULL);    }    /* TODO walk the DTD if present */    ret = xmlNodeListGetString(reader->node->doc, cur->children, 1);    if (ret == NULL) return(xmlStrdup((xmlChar *)""));    return(ret);}/** * xmlTextReaderGetAttribute: * @reader:  the xmlTextReaderPtr used * @name: the qualified name of the attribute. * * Provides the value of the attribute with the specified qualified name. * * Returns a string containing the value of the specified attribute, or NULL *    in case of error. The string must be deallocated by the caller. */xmlChar *xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) {    xmlChar *prefix = NULL;    xmlChar *localname;    xmlNsPtr ns;    xmlChar *ret = NULL;    if ((reader == NULL) || (name == NULL))	return(NULL);    if (reader->node == NULL)	return(NULL);    if (reader->curnode != NULL)	return(NULL);    /* TODO: handle the xmlDecl */    if (reader->node->type != XML_ELEMENT_NODE)	return(NULL);    localname = xmlSplitQName2(name, &prefix);    if (localname == NULL)	return(xmlGetProp(reader->node, name));        ns = xmlSearchNs(reader->node->doc, reader->node, prefix);    if (ns != NULL)        ret = xmlGetNsProp(reader->node, localname, ns->href);    if (localname != NULL)        xmlFree(localname);    if (prefix != NULL)        xmlFree(prefix);    return(ret);}/** * xmlTextReaderGetAttributeNs: * @reader:  the xmlTextReaderPtr used * @localName: the local name of the attribute. * @namespaceURI: the namespace URI of the attribute. * * Provides the value of the specified attribute * * Returns a string containing the value of the specified attribute, or NULL *    in case of error. The string must be deallocated by the caller. */xmlChar *xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName,			    const xmlChar *namespaceURI) {    if ((reader == NULL) || (localName == NULL))	return(NULL);    if (reader->node == NULL)	return(NULL);    if (reader->curnode != NULL)	return(NULL);    /* TODO: handle the xmlDecl */    if (reader->node->type != XML_ELEMENT_NODE)	return(NULL);    return(xmlGetNsProp(reader->node, localName, namespaceURI));}/** * xmlTextReaderGetRemainder: * @reader:  the xmlTextReaderPtr used * * Method to get the remainder of the buffered XML. this method stops the * parser, set its state to End Of File and return the input stream with * what is left that the parser did not use. * * The implementation is not good, the parser certainly procgressed past * what's left in reader->input, and there is an allocation problem. Best * would be to rewrite it differently. * * Returns the xmlParserInputBufferPtr attached to the XML or NULL *    in case of error. */xmlParserInputBufferPtrxmlTextReaderGetRemainder(xmlTextReaderPtr reader) {    xmlParserInputBufferPtr ret = NULL;    if (reader == NULL)	return(NULL);    if (reader->node == NULL)	return(NULL);    reader->node = NULL;    reader->curnode = NULL;    reader->mode = XML_TEXTREADER_MODE_EOF;    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->allocs & XML_TEXTREADER_INPUT) {	ret = reader->input;	reader->input = NULL;	reader->allocs -= XML_TEXTREADER_INPUT;    } else {	/*	 * Hum, one may need to duplicate the data structure because	 * without reference counting the input may be freed twice:	 *   - by the layer which allocated it.	 *   - by the layer to which would have been returned to.	 */	TODO	return(NULL);    }    return(ret);}/** * xmlTextReaderLookupNamespace: * @reader:  the xmlTextReaderPtr used * @prefix: the prefix whose namespace URI is to be resolved. To return *          the default namespace, specify NULL * * Resolves a namespace prefix in the scope of the current element. * * Returns a string containing the namespace URI to which the prefix maps *    or NULL in case of error. The string must be deallocated by the caller. */xmlChar *xmlTextRea

⌨️ 快捷键说明

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