第二人生的源码分析(七十)LLXmlTreeParser类生成XML树

LLXmlTreeParser类是继承类 LLXmlParser,主要实现创建树节点,并且把树节点保存起来,这样就可以方便外面查找XML里的数据。下面先来分析这个类的声明:
#001 class LLXmlTreeParser : public LLXmlParser
#002 {
#003 public:
 
类的构造函数和析构函数。
#004     LLXmlTreeParser(LLXmlTree* tree);
#005     virtual ~LLXmlTreeParser();
#006 
 
下面的函数实现分析 XML配置文件。
#007     BOOL parseFile(const std::string &path, LLXmlTreeNode** root, BOOL keep_contents );
#008 
#009 protected:
#010     const std::string& tabs();
#011 
 
下面重载基类的虚函数,主要创建树节点和节点管理。
#012     // Overrides from LLXmlParser
#013     virtual void    startElement(const char *name, const char **attributes);
#014     virtual void    endElement(const char *name);
#015     virtual void    characterData(const char *s, int len);
#016     virtual void    processingInstruction(const char *target, const char *data);
#017     virtual void    comment(const char *data);
#018     virtual void    startCdataSection();
#019     virtual void    endCdataSection();
#020     virtual void    defaultData(const char *s, int len);
#021     virtual void    unparsedEntityDecl(
#022         const char* entity_name,
#023         const char* base,
#024         const char* system_id,
#025         const char* public_id,
#026         const char* notation_name);
#027 
 
下面函数创建一个 LLXmlTreeNode节点。
#028     //template method pattern
#029     virtual LLXmlTreeNode* CreateXmlTreeNode(const std::string& name, LLXmlTreeNode* parent);
#030 
#031 protected:
 
保存类 LLXmlTree的指针。
#032     LLXmlTree*      mTree;
 
保存 XML开始的根节点。
#033     LLXmlTreeNode* mRoot;
 
保存当前节点。
#034     LLXmlTreeNode* mCurrent;
#035     BOOL            mDump; // Dump parse tree to llinfos as it is read.
#036     BOOL            mKeepContents;
#037 };
#038 
 
 
下面再来详细地分析它的分析 XML文件的函数,如下:
#001 BOOL LLXmlTreeParser::parseFile(const std::string &path, LLXmlTreeNode** root, BOOL keep_contents)
#002 {
#003     llassert( !mRoot );
#004     llassert( !mCurrent );
#005 
 
保存是否保存内容。
#006     mKeepContents = keep_contents;
#007 
 
调用基类 parseFile函数分析XML数据。
#008     BOOL success = LLXmlParser::parseFile(path);
#009 
#010     *root = mRoot;
#011     mRoot = NULL;
#012 
#013     if( success )
#014     {
#015         llassert( !mCurrent );
#016     }
#017     mCurrent = NULL;
#018    
#019     return success;
#020 }
 
通过函数 startElement创建XML的数据节点,并保存到mCurrent节点里,其实是调用下面的函数添加到节点管理里:
#001 void LLXmlTreeNode::addAttribute(const std::string& name, const std::string& value)
#002 {
 
添加属性名称到属性管理表里。
#003     LLStdStringHandle canonical_name = LLXmlTree::sAttributeKeys.addString( name );
#004     const LLString *newstr = new LLString(value);
#005     mAttributes[canonical_name] = newstr; // insert + copy
#006 }
 
当需要读取这个 XML节点数据时,是通过类LLXmlTreeNode的函数hasAttribute判断是否有这个属性,通过函数getAttributeS32等获取属性值。这样就完成了XML配置文件的分析,并获取到XML配置里的数据。
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值