libxml2 xmlTextReader 解析xml实例

使用libxml2库的xmlTextReaderPtr解析XML文件,读取节点属性并输出到result.xml。示例中展示了如何处理XML元素、结束标记及属性,并提供了错误处理和内存清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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常用函数总结
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值