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