《tinyxml使用总结》由会员分享,可在线阅读,更多相关《tinyxml使用总结(13页珍藏版)》请在金锄头文库上搜索。
1、读者对象:对 TinyXml 有一定了解的人。本文是对 TinyXml 工具的一些知识点的理解。需要讨论的请联系:QQ :471202412 1 TinyXml 中对 TiXmlNode 进行了分类,是用一个枚举进行描述的。enum NodeTypeDOCUMENT, 文档节点ELEMENT, 元素节点COMMENT, 还没弄清楚UNKNOWN, 未知节点TEXT, 文本节点DECLARATION, 声明节点TYPECOUNT 还没弄清楚;TiXmlNode * pNode-Type() 函数可以返回节点的类型。枚举的比较方法:TiXmlText:TEXT = pNode-Type();这几个
2、类型非常重要,尤其是在遍历 xml 时或者查找一个节点时我对节点和元素的理解如下:为了说明问题,我使用下面的 xml 文档来举例说明vertor20中国山西王大庄2.1 节点:一种对文档结构的描述对象2.2 元素:对文档某一个数据块的描述2.3 文本是指没有孩子的节点例如大王庄 文本节点是:大王庄 然而判断一个节点是否是文本节点时并不是根据 pNode-NoChildren()来判断,而是根据节点的类型来判断因为如果一个节点形如: 它也是没有孩子节点的。2.4 节点类可以转换成元素对象。例如 TiXmlElement * pElement = pNode-ToElement();那什么时候需要
3、转换成元素呢?当你需要元素的一些属性值是就需要转换了。2.5 元素跟节点都有关于访问孩子的函数,元素访问孩子的函数: FirstChildElement() 返回当前元素的孩子元素NextSiblingElement() 返回当前元素的同级元素节点访问节点孩子的函数:FirstChild() 返回当前节点的孩子节点NextSibing() 返回当前节点的同级下一个节点个人觉得 元素访问和节点访问在一般的访问下没有区别,两者都可以访问的孩子对于一些特殊的情况下才需要区分。比如你要访问属性时,就需要用元素来找到第一个属性值。2.6 对于遍历一个 xml 文档时,思路一般是这样的:1 载入一个 xm
4、l2 获得根元素(不是根节点)3 循环访问每一个根元素的子元素4 对每一个子元素进行解析。4.1 获取子元素的类型 Type4.2 switch(Type)case TEXT:输出文本节点的值 pNode-value()case ELEMENT:获取元素的 value(这里的 value 指的是元素的名字,例如:person 元素)循环获取元素的每一个属性a 得到元素的第一个属性b dowhile 循环获取每一个属性和值。case COMMENT: 暂时不用管case UNKNOWN: 暂时不用管case DECLARATION: 获取元素的版本,编码方式等等4.3 循环遍历子元素的下一级元素
5、(即孙子元素) 在这里也可以遍历孙子节点。递归调用第四步。基本思路就是这样,具体代码见后面2.7 如果定位一个节点唯一确定一个节点的方法是根据节点名,属性名,属性值1 根据 xml 的遍历思想找到与给定节点名一样的节点2 如果这个节点有属性并且属性名和值与给定的一致,说明找到了。3 如果没有一致的,说明解析失败。4 如果没有给定属性名和值,则可以默认只查找与节点名一致的节点。2.8 编码问题用 TinyXml 加载一个 xml 文档时,根据文档的编码方式来加载,在操作过程中需要进行编码转换如果 encoding=utf-8 则在遍历时,需要进行编码转换,具体转换还没找到方法。2.9 指针的 n
6、ew 和释放。TinyXml 已经帮我们把指针分配的内存进行了管理,在析构函数中进行了处理,我们不需要处理 new 出来的指针如果我们显示的 delete 时,有可能影响程序运行。3.0 对于添加一个节点,删除一个节点,更新一个节点时,都需要在最后 SaveFile,我就好几次忘了 SaveFile,所以调了老半天。3.1 总的来说,Tinyxml 还是不错的,以后继续学习。部分功能代码3.2 对于插入一个节点,首先获取要插入节点的父节点,然后进行插入,最需要注意的是在查询父节点的是时候,必须对应同一个文本对象来操作。有可能在两个函数中同时打开了同一个 xml 文档,虽然名字一样,但是不是同一
7、个 xmldocument 对象,所以操作会失败。最后要保存。/*/* 创建一个 xml 文档 */*/void createXml()/创建一个 XML 的文档对象。TiXmlDocument *myDocument = new TiXmlDocument();TiXmlDeclaration* decl = new TiXmlDeclaration(1.0,gb2312,yes);myDocument-LinkEndChild(decl);/创建一个根元素并连接。TiXmlElement *RootElement = new TiXmlElement(Persons);myDocument
8、-LinkEndChild(RootElement);for(int i=0; iLinkEndChild(PersonElement);/设置 Person 元素的属性。PersonElement-SetAttribute(ID, i);/创建 name 元素、age 元素并连接。TiXmlElement *NameElement = new TiXmlElement(name);TiXmlElement *AgeElement = new TiXmlElement(age);PersonElement-LinkEndChild(NameElement);PersonElement-Link
9、EndChild(AgeElement);/设置 name 元素和 age 元素的内容并连接。TiXmlText *NameContent = new TiXmlText(周星星);TiXmlText *AgeContent = new TiXmlText(20);NameElement-LinkEndChild(NameContent);AgeElement-LinkEndChild(AgeContent);/保存到文件myDocument-SaveFile(test.xml);/*/* 遍历一个 xml 文档 */*/void readXml()/创建一个 XML 的文档对象。TiXmlD
10、ocument *myDocument = new TiXmlDocument(Person.xml);myDocument-LoadFile();/获得 xml 的头,即声明部分TiXmlDeclaration* decl = myDocument-FirstChild()-ToDeclaration();cout Version() Encoding() RootElement();/输出根元素名称cout Value() FirstChildElement();pNode;pNode=pNode-NextSiblingElement()msg += dumpNode(pNode,0);c
11、out Type();if(t = TiXmlText:TEXT) /节点类型是 text 节点pText = pNode-ToText();string text = pText-Value();if(!text.empty()msg = msg + =+ text;else if(t = TiXmlText:ELEMENT) /节点类型是 Elementmsg = msg + rn;int num = flag;while(num = 1)msg = msg + t;num-;msg = msg + pNode-Value();/输出属性TiXmlElement * pElement =
12、pNode-ToElement();TiXmlAttribute * pAttr = pElement-FirstAttribute();TiXmlAttribute * pNextAttr =NULL;string tmpAttrMsg = ;if(pAttr != NULL)string tmpAttrVal = ;string tmpAttrName = ;dotmpAttrVal = pAttr-Value();tmpAttrName = pAttr-Name();tmpAttrMsg += tmpAttrName+= + tmpAttrVal+,; /各个属性之间用逗号分隔while
13、(pAttr = pAttr-Next();tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_last_of(,);tmpAttrMsg += ;msg += tmpAttrMsg;/循环访问它的每一个元素for(pChildNode=pNode-FirstChild();pChildNode!=0;pChildNode = pChildNode-NextSibling()msg = msg + dumpNode(pChildNode,flag+1);return msg;/*/* 查询出唯一节点 */* 参数说明:string nodeName 节点名string nodeAttrName 节点的属性string nodeAttrValue 节点属性的值/*/TiXmlNode * SelectSingleNode(string nodeName,string nodeAttrName,string nodeAttrValue)/加载一个 XML 的文档对象。TiXmlDocument *xmlDoc = new TiXmlDocument(Person.xml);if(!xmlDoc-LoadFile() /是 tinyXml 会自动处理文档的 BOMreturn NULL;if(xmlDoc = NU