unimrcp自带xml解析器使用

本文详细介绍了在使用Unimrcp过程中遇到的XML解析问题及解决方案,特别是针对格式化XML中换行符的处理,提供了具体的代码示例。

在使用unimrcp的时候 有处需要对xml进行解析 解析时发现unimrcp有自带的xml格式处理工具:
工具路径

解析

xml格式为:

<?xml version=\"1.0\" ?><test version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"zh-cn\">这里是我要的内容。</test>

解析代码为:

	char *myxml = "<?xml version=\"1.0\" ?><test version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"zh-cn\">这里是我要的内容。</test>";

	//开始解析xml
    apr_pool_t *pool;//这里要替换成自己的pool
    apr_xml_parser *xp;
    apr_status_t rv;
    apr_xml_doc *doc;
    const apr_xml_elem *elem;
    apr_text *at;
    char *text;


    //初始化解析器
    xp = apr_xml_parser_create(pool);
    //解析myxml
    rv = apr_xml_parser_feed(xp, myxml, strlen(myxml));

    //APR_SUCCESS为正确状态
    if (rv == APR_SUCCESS){
        //转换为apr_xml_doc对象
        apr_xml_parser_done(xp, &doc);
        //提取根节点
        elem = doc->root;
        //提取text
        at= elem->first_cdata.first;
        //取值
        text= at->text;
      }	

踩坑

以为到这里就结束了吗? 并没有! 这里有一个大坑!
当接收到的xml是格式化的时候 换行符算作doc的一个节点!

<?xml version="1.0" ?>
<test version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="zh-cn">
这里是我要的内容。
</test>

只能对解析方式进行修改 遍历节点判断 详见代码注释

	char *myxml = "<?xml version=\"1.0\" ?>\n"
                  "<test version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"zh-cn\">\n"
                  "这里是我要的内容。\n"
                  "</test>";

	//开始解析xml
    apr_pool_t *pool;//这里要替换成自己的pool
    apr_xml_parser *xp;
    apr_status_t rv;
    apr_xml_doc *doc;
    const apr_xml_elem *elem;
    apr_text *at;
    char *text;


    //初始化解析器
    xp = apr_xml_parser_create(pool);
    //解析myxml
    rv = apr_xml_parser_feed(xp, myxml, strlen(myxml));

    //APR_SUCCESS为正确状态
    if (rv == APR_SUCCESS){
        //转换为apr_xml_doc对象
        apr_xml_parser_done(xp, &doc);
        //遍历所有root节点
        for(elem = doc->root; elem; elem = elem->next) {
            //跳过没有下一层结构的节点和二层节点里没有text的节点
            if (!elem->first_cdata.first || !elem->first_cdata.first->text)
                continue;
            //选取name为test的节点
            if(strcasecmp(elem->name,"test") == 0) {
                //遍历test下面所有字符(apr_text 类型)
                for(at = elem->first_cdata.first;speak_text;at = speak_text->next){
                    //选取不为换行符的值
                    if(strcasecmp(speak_text->text,"\n") != 0) {
                        text = speak_text->text;
                        break;
                    }
                }
            }
        }
    }

注意:不要忘了引入头文件

#include "apr_xml.h"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值