第二人生的源码分析(六十八)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数据生成一棵树返回来。
 
posted @ 2008-05-21 21:03  ajuanabc  阅读(172)  评论(0编辑  收藏  举报