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

被折叠的 条评论
为什么被折叠?



