第二人生的源码分析(六十八)LLXMLNode使用Expat库分析XML文件

在前面看到怎么打开 XML文件,在那个函数的后面调用parseBuffer函数来分析XML数据,那么在这个函数是怎么样进行XML数据分析的呢?现在就仔细地分析这个函数的代码,它的代码如下:
#001// static
#002bool LLXMLNode::parseBuffer(
#003 U8* buffer,
#004 U32 length,
#005 LLXMLNodePtr& node,
#006 LLXMLNode* defaults)
#007{
调用 expat库函数XML_ParserCreate来创建一个分析器。
#008 // Init
#009 XML_Parser my_parser = XML_ParserCreate(NULL);
设置 XML元素的开始函数StartXMLNode和结束函数EndXMLNode。
#010 XML_SetElementHandler(my_parser, StartXMLNode, EndXMLNode);
设置不同的字符处理函数 XMLData。
#011 XML_SetCharacterDataHandler(my_parser, XMLData);
#012
开始创建一个 XML节点。
#013 // Create a root node
#014 LLXMLNode *file_node_ptr = new LLXMLNode("XML", FALSE);
#015 LLXMLNodePtr file_node = file_node_ptr;
#016
保存这个节点的分析器。
#017 file_node->mParser = &my_parser;
#018
设置传送给回调函数的数据。
#019 XML_SetUserData(my_parser, (void *)file_node_ptr);
#020
调用 XML_Parse函数进行XML文件分析。
#021 // Do the parsing
#022 if (XML_Parse(my_parser, (const char *)buffer, length, TRUE) != XML_STATUS_OK)
#023 {
#024 llwarns << "Error parsing xml error code: "
#025 << XML_ErrorString(XML_GetErrorCode(my_parser))
#026 << " on lne " << XML_GetCurrentLineNumber(my_parser)
#027 << llendl;
#028 }
#029
XML文件分析完成,然后删除创建的 XML分析器。
#030 // Deinit
#031 XML_ParserFree(my_parser);
#032
分析 XML失败,没有任何数据。
#033 if (!file_node->mChildren || file_node->mChildren->map.size() != 1)
#034 {
#035 llwarns << "Parse failure - wrong number of top-level nodes xml."
#036 << llendl;
#037 node = new LLXMLNode();
#038 return false;
#039 }
#040
返回已经分析好的 XML节点树。
#041 LLXMLNode *return_node = file_node->mChildren->map.begin()->second;
#042
#043 return_node->setDefault(defaults);
#044 return_node->updateDefault();
#045
#046 node = return_node;
#047 return true;
#048}
从这个函数的代码里看到,跟前面介绍的 expat例子是一样的,调用库函数XML_ParserCreate、XML_SetElementHandler、XML_Parse等三个函数就完成了XML的分析过程,只不过这里会把所有分析到的XML数据生成一棵树返回来。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值