关于tinyxml的剖析及遍历

关于tinyxml的剖析及遍历

579人阅读 评论(0) 收藏 举报

之前在学习xml文本解析,发现一个比较好用的开源程序,tinyxml,在这里分享一下tinyxml的原理跟XML文件的遍历操作。

TinyXML是一个简单的,轻量级的,由C++实现的XML文档的解析器,它可以被其它程序方便地集成进去使用

关于tinyxml的剖析:

下面是名为 example.xml的文档,后续的剖析都会以这个xml文档为例:

example.xmlexample.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树:

DOM treeDOM tree

上图中 蓝色的指向first child, 红色的指向last child, 绿色的指向next sibling, 紫色的指向previoud  sibling, 黑色的指向parent

(2)tinyxml 把一篇xml文档里的各个元素抽象成如下图所示的对象:

tyxmlTinyXml Object Model
  • 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文档和上面定义的对象可以得到如下的对应关系:

exampleexample

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();

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值