您的位置:首页 > Web前端 > Node.js

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

2008-05-21 21:03 781 查看
在前面看到怎么打开XML文件,在那个函数的后面调用parseBuffer函数来分析XML数据,那么在这个函数是怎么样进行XML数据分析的呢?现在就仔细地分析这个函数的代码,它的代码如下:
#001 // static
#002 bool 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数据生成一棵树返回来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐