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

在前面看到怎么打开 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数据生成一棵树返回来。
 

你可能感兴趣的:(xml,数据分析,File,null,buffer,Parsing)