#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常用函數總結