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