天天看點

libxml2 xmlTextReader 解析xml執行個體

#include <stdio.h>
#include <string.h>

#define IN_LIBXML

#include <libxml/xmlreader.h>

static FILE *file;
void printAttribute(xmlTextReaderPtr reader)
{
    if(1==xmlTextReaderHasAttributes(reader))
    {
        xmlChar *name,*value;
        int res=xmlTextReaderMoveToFirstAttribute(reader);//首先移動current instance 指向第一個元素
        while(1==res)
        {
            name=xmlTextReaderConstName(reader);
            value=xmlTextReaderConstValue(reader);
            fprintf(file,"\tattribute=[%s],value=[%s]\n",name,value);
            res=xmlTextReaderMoveToNextAttribute(reader);
        }
        xmlTextReaderMoveToElement(reader);//重新将current instance指向current node, 否則之後讀取節點value時會出現混亂
    }
}
void printNode(xmlTextReaderPtr reader)
{
    const xmlChar *name,*value;
    name=xmlTextReaderConstName(reader);

    if(xmlTextReaderNodeType(reader)==XML_READER_TYPE_ELEMENT)
    {
        fprintf(file,"startMarkup=%s",name);
        printAttribute(reader);
    }else if(xmlTextReaderNodeType(reader)==XML_READER_TYPE_END_ELEMENT)
    {
        //fprintf(file,"endMarkup=%s",name);
    }else
    {
        fprintf(file,"flag=%s",name);
    }
    if(xmlTextReaderHasValue(reader))
    {
        value=xmlTextReaderConstValue(reader);
        fprintf(file,"\tvalue=%s",value);
    }

    fprintf(file,"\n");
}
int main(int argv,char *argc[])
{
    LIBXML_TEST_VERSION

    //static char buffer[]="<root>"
    //"<student>123</student>"
    //"</root>";

    xmlTextReaderPtr reader;
    reader=xmlReaderForFile(argc[1],NULL,XML_PARSE_NOBLANKS);//忽略空節點
    //reader=xmlReaderForMemory(buffer,strlen(buffer),"something.xml",NULL,0);

    if(reader==NULL)
    {
        fprintf(stderr,"error to read");
        xmlCleanupParser();
        return(1);
    }
    file=fopen("result.xml","w");

    int ret=xmlTextReaderRead(reader);
    while(ret==1)
    {
        printNode(reader);
        ret=xmlTextReaderRead(reader);
    }

    fclose(file);
    xmlFreeTextReader(reader);
    if(ret!=0)
    {
        fprintf(stderr,"error to read");
        xmlCleanupParser();
        return(1);
    }

    xmlCleanupParser();


    return(0);
}
           

函數總結: libxml2常用函數總結