关于tinyxml的剖析及遍历
来源:互联网 发布:手机的危害数据 英文 编辑:程序博客网 时间:2024/05/20 00:38
之前在学习xml文本解析,发现一个比较好用的开源程序,tinyxml,在这里分享一下tinyxml的原理跟XML文件的遍历操作。
TinyXML是一个简单的,轻量级的,由C++实现的XML文档的解析器,它可以被其它程序方便地集成进去使用
关于tinyxml的剖析:
下面是名为 example.xml的文档,后续的剖析都会以这个xml文档为例:
(1)tinyxml把xml文档建立成一棵DOM(Document Object Model)树,具体实现用的是firstchild–nextsibling tree,下面是对该树的模型的一个简单介绍:
firstchild-nextsibling是一种多叉树常用的实现方法,每个结点只需要知道它的第一个孩子结点(first child node)和它的下一个兄弟结点(next sibling node),这样一整棵树的结构就会建立起来,也可以用根结点的指针为起点来对整棵树进行遍历。在tinyxml中,每个结点保存了它的first child, last child, next sibling, previous sibling, parent这五个与它相关的结点的指针,这样便可提供更加方便的遍历接口。下面是对上面的example.xml的内容所建立的DOM树:
上图中 蓝色的指向first child, 红色的指向last child, 绿色的指向next sibling, 紫色的指向previoud sibling, 黑色的指向parent
(2)tinyxml 把一篇xml文档里的各个元素抽象成如下图所示的对象:
- TiXmlBase: 所有tinyxml中的对象的公共基类,实现了一些公共的操作,比如字符编码转换等,另外还定义了一些公共的数据结构,比如错误类型等。
- TiXmlNode: 是DOM树中结点元素的基类型,它定义了DOM树结点的一些特征数据以及一些相关的操作。
- TiXmlDocument:对应于XML文档整体的一个对象,一棵DOM的根结点是TiXmlDocument类型,而且基它结点不能为TiXmlDocument类型。(example.xml)
- TiXmlDeclaration:对应于XML文档开始部分声明部分的对象,它主要包含version, encode, standalone三个方面的数据信息以及相关的操作。(<?xml version=”1.0″ standalone=no>)
- TiXmlComment: 对应于XML文档中的注释部分的对象,它主要包含注释的内容以及相关的操作。(<!– Our to do list data –> )
- TiXmlElement:对应于XML文档中普通的元素的对象,每个元素有一个对应的名字,另外还可以有一些属性。TiXmlElement包含了这些相关信息及其操作。 ( <ToDo> <Item priority=”1″> <bold> <Item priority=”2″>)
- TiXmlText: 对应于XML文档中元素中的文本信息的对象,它实现了文本信息相关的操作。(Go to the , Toy store!, Do bills)
- TiXmlAttributeSet: XML文档中某个元素的所有属性的集合,它是TiXmlElement的一部分,它用来管理该元素的所有属性。
- TiXmlAttribute: XML文档中的元素的属性所对应的对象。它是一个name-value pair对象,name是属性名,value是属性值。
- TiXmlUnknown: 所有的用上面的对象不能表示的内容所对应的对象。
example.xml文档和上面定义的对象可以得到如下的对应关系:
XML文件的遍历 了解了xml文件是如何遍历的,我们就能够从中解析出我们需要的信息,解析的程序代码如下:
#include <iostream>
#include <string>
#include “tinyxml.h”
using namespace std;
void ParaseUpdateXml(TiXmlNode* pParent);
int main()
{
TiXmlDocument doc(”abc.xml”);
doc.LoadFile();
TiXmlElement* root = doc.RootElement();
if(!root) return 1;
ParaseUpdateXml(root);
return 0;
}
void ParaseUpdateXml(TiXmlNode* pParent)
{
if(pParent == NULL)
return;
TiXmlNode* pchild = pParent->FirstChild();
while(pchild)
{
cout << pchild->Value() << ” “;
int t = pchild->Type();
if( t == TiXmlNode::ELEMENT)
{
TiXmlAttribute* attr = pchild->ToElement()->FirstAttribute();
if(attr)
{
TiXmlNode* node = pchild;
while(node)
{
while(attr)
{
cout << ” ” << attr->Name() << “=” << attr->Value();
attr = attr->Next();
}
cout << endl;
node = node->NextSiblingElement();
}
}
ParaseUpdateXml(pchild);
}
else if( t == TiXmlNode::TEXT)
{
cout << pchild->Value() << endl;
}
pchild = pchild->NextSibling();
}
}
- 关于tinyxml的剖析及遍历
- 关于tinyxml的剖析及遍历
- 关于tinyxml的剖析及遍历
- 关于TinyXML的使用笔记
- 关于TinyXMl的操作函数
- 关于TinyXMl的操作函数
- TinyXML 源码剖析(之一)
- TinyXml使用与剖析
- TinyXml使用与剖析
- 关于tinyXML的handle使用参考
- C++ tinyxml的编译及简单使用方法
- linux tinyxml遍历
- TinyXML 递归遍历实例
- 一个是用tinyxml遍历xml的源码
- TinyXML源码剖析(之二)
- 简介TinyXml及使用
- XML及TinyXML简介
- 关于二叉搜索树及三种树遍历的特点
- Map拆分List拆分
- ruei安装文档
- [Phonegap+Sencha Touch] 移动开发8、store和proxy
- C#中抽象类和接口的区别与联系
- JS输入框校验
- 关于tinyxml的剖析及遍历
- 分解url转为post请求
- [Phonegap+Sencha Touch] 移动开发4、Sencha Touch初步使用
- 初识云计算day004
- 今天用Hex工具修改登陆器目录的时候发现原EXE文件被毁了
- 13-14寒假作业1
- Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)
- C语言输入中对scanf和gets的讨论
- 动态加载原创js的代码