tinyxml的使用

在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作

下载TinyXML类库:http://download.csdn.net/detail/tennysonsky

然后解压缩TinyXML后,将这六个文件添加到你的c++工程中,分别是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。

示例代码如下:

  1 // first.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <iostream>
  6 #include <stdio.h>
  7 #include "tinyxml.h"
  8 #include <cstringt.h>
  9 
 10 using namespace std;
 11 
 12 int writeXmlFile()
 13 {
 14     TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针  
 15 
 16     //文档格式声明  
 17     TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
 18     writeDoc->LinkEndChild(decl); //写入文档  
 19 
 20     int n = 5;  //父节点个数   即有几个孩子
 21 
 22     TiXmlElement *RootElement = new TiXmlElement("Infooo");//根元素名字  
 23     RootElement->SetAttribute("num", n); //属性  
 24     writeDoc->LinkEndChild(RootElement); //将属性写入文档
 25 
 26     for (int i = 0; i < n; i++)//n个父节点  
 27     {
 28         TiXmlElement *StuElement = new TiXmlElement("Stu");//Stu  
 29         //设置属性  
 30         StuElement->SetAttribute("class", "A");
 31         if (2 == i)
 32         {
 33             StuElement->SetAttribute("class", "B");
 34         }
 35 
 36         StuElement->SetAttribute("id", i + 1);
 37         StuElement->SetAttribute("flag", (i + 1) * 10);
 38         RootElement->LinkEndChild(StuElement);//父节点写入文档  
 39 
 40         //姓名  
 41         TiXmlElement *nameElement = new TiXmlElement("name");
 42         StuElement->LinkEndChild(nameElement);
 43 
 44         TiXmlText *nameContent = new TiXmlText("mike");
 45         nameElement->LinkEndChild(nameContent);
 46 
 47         //分数  
 48         TiXmlElement *scoreElement = new TiXmlElement("score");
 49         StuElement->LinkEndChild(scoreElement);
 50 
 51         TiXmlText *scoreContent = new TiXmlText("88");
 52         scoreElement->LinkEndChild(scoreContent);
 53 
 54         //城市  
 55         TiXmlElement *cityElement = new TiXmlElement("city");
 56         StuElement->LinkEndChild(cityElement);
 57 
 58         TiXmlText *cityContent = new TiXmlText("Shenzhen");
 59         cityElement->LinkEndChild(cityContent);
 60 
 61     }
 62 
 63     writeDoc->SaveFile("stu_info.xml");
 64     delete writeDoc;
 65 
 66     return 1;
 67 }
 68 
 69 //解析xml文件  
 70 int readXmlFile()
 71 {
 72     TiXmlDocument mydoc("stu_info.xml");//xml文档对象  
 73     bool loadOk = mydoc.LoadFile();//加载文档  
 74     if (!loadOk)
 75     {
 76         cout << "could not load the test file.Error:" << mydoc.ErrorDesc() << endl;
 77         exit(1);
 78     }
 79 
 80     TiXmlElement *RootElement = mydoc.RootElement();  //根元素, Infooo  
 81     cout << "[root name]" << RootElement->Value() << "\n";
 82 
 83     TiXmlElement *pEle = RootElement;
 84 
 85     //遍历该结点  
 86     for (TiXmlElement *StuElement = pEle->FirstChildElement();//第一个子元素  
 87         StuElement != NULL;
 88         StuElement = StuElement->NextSiblingElement())//下一个兄弟元素  
 89     {
 90         // StuElement->Value() 节点名称  
 91         cout << StuElement->Value() << " ";
 92         TiXmlAttribute *pAttr = StuElement->FirstAttribute();//第一个属性  
 93 
 94         while (NULL != pAttr) //输出所有属性  
 95         {
 96             cout << pAttr->Name() << ":" << pAttr->Value() << " ";
 97             pAttr = pAttr->Next();
 98         }
 99         cout << endl;
100 
101         //输出子元素的值  
102         for (TiXmlElement *sonElement = StuElement->FirstChildElement();
103             sonElement;
104             sonElement = sonElement->NextSiblingElement())
105         {
106             cout << sonElement->FirstChild()->Value() << endl;
107         }
108     }
109 
110     return 1;
111 }
112 
113 int _tmain(int argc, _TCHAR* argv[])
114 {
115     writeXmlFile();
116     cout << "\nafter write\n";
117     readXmlFile();
118     cout << "hello" << endl;
119     getchar();
120     return 0;
121 }

tinyxml的增删改查

TiXmlElement *cityElement = new TiXmlElement("city");
StuElement->LinkEndChild(cityElement);

StuElement->SetAttribute("id", i + 1);
RootElement->LinkEndChild(StuElement)

删除某个节点
TiXmlNode node;
node.Clear();

从A节点上移除子节点B
TiXmlNode nodeA;
nodeA. RemoveChild( TiXmlNode* removeThis );

从元素A上移除名字为B的属性
TiXmlAttribute attrA;
attrA. RemoveAttribute( const char * name );

查找内容为<mfid val="1234" />,现需要将1234改成其他值

TiXmlNode* lpnode = NULL;
lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode);
TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute();
//找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的
tiattr->SetValue(mfid.c_str());

替换一个节点
TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );

获取link节点

const TiXmlNode* lpItemNode = NULL;//初始化
lpItemNode = lconfigXML.RootElement()->IterateChildren("link", lpItemNode);
if (lpItemNode == NULL)
{
    //Can not find <link>break;
}

获取link节点中的type属性值

std::string strType = lpItemNode->ToElement()->Attribute("type");

生成的文件名:stu_info.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Infooo num="5">
    <Stu class="A" id="1" flag="10">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
    <Stu class="A" id="2" flag="20">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
    <Stu class="B" id="3" flag="30">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
    <Stu class="A" id="4" flag="40">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
    <Stu class="A" id="5" flag="50">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
</Infooo>

 

详见:http://www.cnblogs.com/hgwang/p/5833638.html

posted @ 2017-08-28 11:55  倾耳听  阅读(481)  评论(0编辑  收藏  举报