TinyXml查找唯一节点及修改节点操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TinyXml查找唯一节点及修改节点操作
TinyXml查找唯一节点及修改节点操作
分类: C++ 算法 2012-10-17 23:22 238人阅读评论(0) 收藏举报
[cpp]view plaincopy?
1.// 读者对象:对TinyXml有一定了解的人。
本文是对TinyXml 工具的一些知识点的理解。
2.// 1 TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的。
3.// enum NodeType
4.// {
5.// DOCUMENT, 文档节点
6.// ELEMENT, 元素节点
7.// COMMENT, 还没弄清楚
8.// UNKNOWN, 未知节点
9.// TEXT, 文本节点
10.// DECLARATION, 声明节点
11.// TYPECOUNT 还没弄清楚
12.// };
13.// TiXmlNode * pNode->Type() 函数可以返回节点的类型。
14.// 枚举的比较方法:TiXmlText::TEXT == pNode->Type();
15.//
16.// 这几个类型非常重要,尤其是在遍历xml时或者查找一个节点时
17.// 我对节点和元素的理解如下:为了说明问题,我使用下面的xml文档来举例说明
18.// <?xml version="1.0" encoding="gb2312"?>
19.// <Persons>
20.// <person Id="200" Shengao=34 ClassName="计本0508">
21.// <name>vertor</name>
22.// <age>20</age>
23.// <address encode="utf-8">
24.// <country>中国</country>
25.// <province>山西</province>
26.// <village>王大庄</village>
27.// </address>
28.// </person>
29.// </Persons>
30.//
31.// 2.1 节点:一种对文档结构的描述对象
32.// 2.2 元素:对文档某一个数据块的描述
33.// 2.3 文本是指没有孩子的节点
34.// 例如<village>大王庄</village> 文本节点是:"大王庄"
35.// 然而判断一个节点是否是文本节点时并不是根据pNode->NoChildren()来判断,而是根据节点的类型来判断
36.// 因为如果一个节点形如:<village></village>它也是没有孩子节点的。
37.// 2.4 节点类可以转换成元素对象。
38.// 例如 TiXmlElement * pElement = pNode->ToElement();
39.// 那什么时候需要转换成元素呢?
40.// 当你需要元素的一些属性值是就需要转换了。
41.// 2.5 元素跟节点都有关于访问孩子的函数,
42.// 元素访问孩子的函数:
43.// FirstChildElement() 返回当前元素的孩子元素
44.// NextSiblingElement() 返回当前元素的同级元素
45.// 节点访问节点孩子的函数:
46.// FirstChild() 返回当前节点的孩子节点
47.// NextSibing() 返回当前节点的同级下一个节点
48.// 个人觉得元素访问和节点访问在一般的访问下没有区别,两者都可以访问的孩子
49.// 对于一些特殊的情况下才需要区分。
比如你要访问属性时,就需要用元素来找到第一个属性值。
50.// 2.6 对于遍历一个xml文档时,思路一般是这样的:
51.// 1 载入一个xml
52.// 2 获得根元素(不是根节点)
53.// 3 循环访问每一个根元素的子元素
54.// 4 对每一个子元素进行解析。
55.// 4.1 获取子元素的类型Type
56.// 4.2 switch(Type)
57.// case TEXT:
58.// 输出文本节点的值pNode->value()
59.// case ELEMENT:
60.// 获取元素的value(这里的value指的是元素的名字,例如:person元素)
61.// 循环获取元素的每一个属性
62.// a 得到元素的第一个属性
63.// b do——while循环获取每一个属性和值。
64.// case COMMENT: 暂时不用管
65.// case UNKNOWN: 暂时不用管
66.// case DECLARATION:
67.// 获取元素的版本,编码方式等等
68.// 4.3 循环遍历子元素的下一级元素(即孙子元素) 在这里也可以遍历孙子节点。
69.// 递归调用第四步。
70.// 基本思路就是这样,具体代码见后面
71.// 2.7 如果定位一个节点
72.// 唯一确定一个节点的方法是根据节点名,属性名,属性值
73.// 1 根据xml的遍历思想找到与给定节点名一样的节点
74.// 2 如果这个节点有属性并且属性名和值与给定的一致,说明找到了。
75.// 3 如果没有一致的,说明解析失败。
76.// 4 如果没有给定属性名和值,则可以默认只查找与节点名一致的节点。
77.// 2.8 编码问题
78.// 用TinyXml加载一个xml文档时,根据文档的编码方式来加载,在操作过程中需要进行编码转换
79.// 如果encoding=utf-8 则在遍历时,需要进行编码转换,具体转换还没找到方法。
80.//
81.// 2.9 指针的 new和释放。
82.// TinyXml已经帮我们把指针分配的内存进行了管理,在析构函数中进行了处理,我们不需要处理new出来的指针
83.// 如果我们显示的delete时,有可能影响程序运行。
84.// 3.0 对于添加一个节点,删除一个节点,更新一个节点时,都需要在最后SaveFile,我就好几次忘了SaveFile,所以调了老半天。
85.// 3.1 总的来说,Tinyxml还是不错的,以后继续学习。
86.// 部分功能代码
87.// 3.2 对于插入一个节点,首先获取要插入节点的父节点,然后进行插入,最需要注意的是在查询父节点的是时候,必须对应同一个文本对象来操作。
有可能在两个函数中同时打开了同一个xml文档,虽然名字一样,但是不是同一个xmldocument对象,所以操作会失败。
88.// 最后要保存。
89.
90.#include "XmlTest.h"
91.
92.#define MAX_NUM 256
93.
94./******************************************************** ****************/
95./* 创建一个xml文档 */
96./******************************************************** ****************/
97.void createXml(const char * ccXmlName)
98.{
99.
100.//创建一个XML的文档对象。
101.TiXmlDocument *myDocument = new TiXmlDocumen t();
102.TiXmlDeclaration* decl = new TiXmlDeclaration("1.0"," gb2312","yes");
103.myDocument->LinkEndChild(decl);
104.
105.//创建一个根元素并连接。
106.TiXmlElement *RootElement = new TiXmlElement("Per sons");
107.myDocument->LinkEndChild(RootElement);
108.
109.for(int i=0; i<10;i++)
110.{
111.//创建一个Person元素并连接。
112.TiXmlElement *PersonElement = new TiXmlElement("P erson");
113.RootElement->LinkEndChild(PersonElement);
114.
115.//设置Person元素的属性。
116.PersonElement->SetAttribute("ID", i);
117.
118.//创建name元素、age元素并连接。
119.TiXmlElement *NameElement = new TiXmlElement("n ame");
120.TiXmlElement *AgeElement = new TiXmlElement("age" );
121.PersonElement->LinkEndChild(NameElement);
122.PersonElement->LinkEndChild(AgeElement);
123.
124.//设置name元素和age元素的内容并连接。
125.TiXmlText *NameContent = new TiXmlText("周星星");
126.TiXmlText *AgeContent = new TiXmlText("20");
Element->LinkEndChild(NameContent);
128.AgeElement->LinkEndChild(AgeContent);
129.
130.}
131.
132.//保存到文件
133.myDocument->SaveFile(ccXmlName);
134.}
135.
136./******************************************************** ****************/
137./* 遍历一个xml文
档 */
138./******************************************************** ****************/
139.void readXml(const char * ccXmlName)
140.{
141.//创建一个XML的文档对象。
142.TiXmlDocument *myDocument = new TiXmlDocumen t(ccXmlName);
143.myDocument->LoadFile();
144.
145.//获得xml的头,即声明部分
146.TiXmlDeclaration* decl = myDocument->FirstChild()->ToDeclaration();
147.cout << "xml文件的版本是:" << decl->Version() << endl;
148.cout << "xml的编码格式是:" << decl->Encoding() << endl;
149.
150.//获得根元素
151.TiXmlElement *RootElement = myDocument->RootEle ment();
152.
153.//输出根元素名称
154.cout << RootElement->Value() << endl;
155.
156.TiXmlNode* pNode = NULL;
157.string msg = "";
158.
159.for(pNode=RootElement->FirstChildElement();pNode; pNode=pNode->NextSiblingElement())
160.{
161.msg += dumpNode(pNode,0);
162.}
163.
164.cout << msg << endl;
165.}
166.
167.
168./******************************************************** ****************/
169./*描述:遍历一个元素
170.时间:2012-9-18
171.参数说明:pNode节点,flag 节点嵌套层数
172./******************************************************** ****************/
173.string dumpNode(TiXmlNode * pNode,int flag)
174.{
175.string msg = "";
176.
177.if(pNode == NULL)
178.{
179.return "";
180.}
181.
182.TiXmlText * pText = NULL;
183.TiXmlNode * pChildNode = NULL;
184.int t = pNode->Type();
185.
186.switch(t)
187.{
188.//节点类型是text节点
189.case TiXmlText::TINYXML_TEXT:
190.{ pText = pNode->ToText();
191.string text = pText->Value();
192.if(!text.empty())
193.{
194.msg = msg + "="+ text;
195.}
196.break;
197.}
198.
199.//节点类型是Element
200.case TiXmlText::TINYXML_ELEMENT:
201.{
202.msg = msg + "\r\n";
203.int num = flag;
204.
205.while(num >= 1)
206.{
207.msg = msg + " ";
208.num--;
209.}
210.
211.msg = msg + pNode->Value();
212.
213.//输出属性
214.TiXmlElement * pElement = pNode->ToElement(); 215.
216.TiXmlAttribute * pAttr = pElement->FirstAttribute(); 217.TiXmlAttribute * pNextAttr =NULL;
218.string tmpAttrMsg = "[";
219.
220.//if(pAttr != NULL && !(string(pAttr->Name())).compa re("name") && !(string(pAttr->Value())).compare("IDH_CFG_USB "))
221.if(pAttr != NULL )
222.{
223.string tmpAttrVal = "";
224.string tmpAttrName = "";
225.
226.do
227.{
228.tmpAttrVal = pAttr->Value();
229.tmpAttrName = pAttr->Name();
230.tmpAttrMsg += tmpAttrName + "=" +tmpAttrVal + ", "; //各个属性之间用逗号分隔
231.}while(pAttr = pAttr->Next());
232.
233./* 去掉最后的',' */
234.tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_las t_of(","));
235.//同上 tmpAttrMsg = tmpAttrMsg.substr(0,tmpAttrMsg.find_last_of( ","));
236.
237.}
238.tmpAttrMsg += "]";
239.msg += tmpAttrMsg;
240.
241.break;
242.}
243.
244.case TiXmlText::TINYXML_DOCUMENT:
245.case TiXmlText::TINYXML_COMMENT:
246.case TiXmlText::TINYXML_UNKNOWN:
247.case TiXmlText::TINYXML_DECLARATION:
248.case TiXmlText::TINYXML_TYPECOUNT:
249.{
250.;//Nothing to do
251.}
252.}
253.
254.//循环访问它的每一个元素
255.for(pChildNode=pNode->FirstChild();pChildNode!=0; pChildNode = pChildNode->NextSibling())
256.{
257.
258.msg = msg + dumpNode(pChildNode,flag+1);
259.
260.}
261.
262.return msg;
263.}
264.
265.
266./******************************************************** ****************/
267./* 查询出唯一节点 */
268./* 参数说明:
269.string nodeName 节点名
270.string nodeAttrName 节点的属性
271.string nodeAttrValue 节点属性的值
272./******************************************************** ****************/
273.TiXmlNode * SelectSingleNode(const char * cXmlNam e,string nodeName,string nodeAttrName,string nodeAttrValue) 274.{
275.//加载一个XML的文档对象。
276.
277.TiXmlDocument *xmlDoc = new TiXmlDocument(cXml Name);
278.if(!xmlDoc->LoadFile()) //是tinyXml会自动处理文档的BOM
279.{
280.return NULL;
281.}
282.
283.
284.if(xmlDoc == NULL)
285.{
286.return NULL;
287.}
288.
289.//获得根元素
290.TiXmlElement *RootElement = xmlDoc->RootElement( );
291.if(RootElement == NULL)
292.{
293.cout << "解析错误,无法获取根元素" << endl;
294.return NULL;
295.}
296.
297.TiXmlNode * pNode = NULL;
298.TiXmlNode * pSelectNode = NULL;
299.string msg = "";
300.
301.for(pNode=RootElement->FirstChildElement();pNode; pNode=pNode->NextSiblingElement())
302.{
303.
304.pSelectNode = selectChildNode(pNode,nodeName,no deAttrName,nodeAttrValue);
305.if(pSelectNode)
306.{
307.break;
308.}
309.}
310.
311.if(pSelectNode)
312.{
313.cout << "解析成功" << endl;
314.cout << "[节点名]=" << pSelectNode->Value() << endl;
315.return pSelectNode;
316.}
317.else
318.{
319.cout << "解析错误,无法获取节点" << endl;
320.return NULL;
321.}
322.
323.}
324.
325.
326.TiXmlNode * SelectSingleNodeByRootEle(TiXmlEleme nt* RootElement,string nodeName,string nodeAttrName,string nodeAttrValue)
327.{
328.//加载一个XML的文档对象。
329.
330.// TiXmlDocument *xmlDoc = new TiXmlDocument(c XmlName);
331.// if(!xmlDoc->LoadFile()) //是tinyXml会自动处理文档的BOM
332.// {
333.// return NULL;
334.// }
335.//
336.//
337.// if(xmlDoc == NULL)
338.// {
339.// return NULL;
340.// }
341.
342.//获得根元素
343.//TiXmlElement *RootElement = xmlDoc->RootEleme nt();
344.if(RootElement == NULL)
345.{
346.cout << "解析错误,无法获取根元素" << endl;
347.return NULL;
348.}
349.
350.TiXmlNode * pNode = NULL;
351.TiXmlNode * pSelectNode = NULL;
352.string msg = "";
353.
354.for(pNode=RootElement->FirstChildElement();pNode; pNode=pNode->NextSiblingElement())
355.{
356.
357.pSelectNode = selectChildNode(pNode,nodeName,no deAttrName,nodeAttrValue);
358.if(pSelectNode)
359.{
360.break;
361.}
362.}
363.
364.if(pSelectNode)
365.{
366.//cout << "解析成功" << endl;
367.//cout << pSelectNode->Value() << endl;
368.return pSelectNode;
369.}
370.else
371.{
372.cout << "解析错误,无法获取节点" << endl;
373.return NULL;
374.}
375.
376.}
377.
378.
379./******************************************************** ****************/
380./*
381.根据父节点循环遍历查找子节点
382.参数说明
383.noteName 节点名
384.noteAttrName 属性名
385.noteAttrValue 属性值
386./******************************************************** ****************/
387.TiXmlNode * selectChildNode(TiXmlNode * pNode,stri ng nodeName,string nodeAttrName,string nodeAttrValue) 388.{
389.if(pNode == NULL)
390.{
391.return NULL;
392.}
393.TiXmlNode * pSelectedNode = NULL;
394.TiXmlNode * pChildNode = NULL;
395.int t = pNode->Type();
396.switch (t)
397.{
398.case TiXmlText::TINYXML_DOCUMENT:
399.case TiXmlText::TINYXML_DECLARATION:
400.case TiXmlText::TINYXML_TEXT:
401.case TiXmlText::TINYXML_UNKNOWN:
402.case TiXmlText::TINYXML_COMMENT:
403.break;
404.case TiXmlText::TINYXML_ELEMENT:
405.if(pNode->Value() == nodeName)
406.{
407.//cout << pNode->Value() << endl;
408.if(!nodeAttrName.empty() && !nodeAttrValue.empty() )
409.{
410.TiXmlElement * pElement = pNode->ToElement();
411.
412.TiXmlAttribute * pAttr = pElement->FirstAttribute();
413.TiXmlAttribute * pNextAttr =NULL;
414.if(pAttr != NULL)
415.{
416.do
417.{
418.if(pAttr->Name()==nodeAttrName&&pAttr->Value()= = nodeAttrValue)
419.{
420.//cout << pAttr->Value() << endl;
421.return pNode;
422.}
423.}while(pAttr = pAttr->Next());
424.}
425.}
426.else
427.{
428.return pNode;
429.}
430.
431.}
432.else
433.{
434.//循环访问它的每一个元素
435.for(pChildNode=pNode->FirstChild();
436.pChildNode!=0;
437.pChildNode = pChildNode->NextSibling())
438.{
439.pSelectedNode = selectChildNode(
440.pChildNode,
441.nodeName,
442.nodeAttrName,
443.nodeAttrValue);
444.if(pSelectedNode)
445.{
446.return pSelectedNode;
447.}
448.}
449.}
450.
451.default:break;
452.}
453.return NULL;
454.}
455.
456.
457.
458./********************************************************
****************/
459./* 普通插入一个节点,还不完善。
*/
460./******************************************************** ****************/
461.bool insert(const char * ccXmlName)
462.{
463.//加载一个XML的文档对象。
464.TiXmlDocument *myDocument = new TiXmlDocumen t(ccXmlName);
465.myDocument->LoadFile();
466.
467.if(myDocument == NULL)
468.{
469.return false;
470.}
471.//获得xml的头,即声明部分
472.TiXmlDeclaration* decl = myDocument->FirstChild()->ToDeclaration();
473.if(decl != NULL)
474.{
475.cout << "xml文件的版本是:" << decl->Version() << endl;
476.cout << "xml的编码格式是:" << decl->Encoding() << endl;
477.}
478.
479.
480.//获得根元素
481.TiXmlElement *RootElement = myDocument->RootEle
ment();
482.
483.if(RootElement != NULL)
484.{
485.
486.//创建一个Person元素并连接。
487.TiXmlElement *PersonElement = new TiXmlElement("P erson");
488.PersonElement->SetAttribute("Id",1);
489.RootElement->LinkEndChild(PersonElement);
490.
491.TiXmlText *textElement = new TiXmlText("Jam");
492.PersonElement->LinkEndChild(textElement);
493.
494.//增加一个team元素
495.TiXmlElement *TeamElement = new TiXmlElement("te am");
496.TeamElement->SetAttribute("TID","001");
497.RootElement->LinkEndChild(TeamElement);
498.
499.//增加team的子节点name
500.TiXmlElement *teamName = new TiXmlElement("nam e");
501.TiXmlText *nameText = new TiXmlT ext("workgroup");
502.teamName->LinkEndChild(nameText);
503.TeamElement->LinkEndChild(teamName);
504.
505.//增加team的子节点type
506.TiXmlElement *teamType = new TiXmlElement("type");
507.TiXmlText *typeText = new TiXmlT ext("SI");
508.teamType->LinkEndChild(typeText);
509.
510.TeamElement->LinkEndChild(teamType);
511.
512.myDocument->SaveFile("Person.xml");
513.
514.
515.//输出根元素名称
516.cout << RootElement->Value() << endl;
517.return true;
518.}
519.return false;
520.}
521.
522.
523.
524./******************************************************** ****************/
525./* 获取一个节点的属性 */
526./******************************************************** ****************/
527.string getAttribute(TiXmlNode * pNode)
528.{
529.if(pNode == NULL) return "";
530.//输出属性
531.string msg = "";
532.TiXmlElement * pElement = pNode->ToElement();
533.
534.TiXmlAttribute * pAttr = pElement->FirstAttribute();
535.TiXmlAttribute * pNextAttr =NULL;
536.string tmpAttrMsg = "";
537.
538.if(pAttr != NULL)
539.{
540.string tmpAttrVal = "";
541.string tmpAttrName = "";
542.
543.do
544.{
545.tmpAttrVal = pAttr->Value();
546.tmpAttrName = pAttr->Name();
547.tmpAttrMsg += "[" + tmpAttrName + "]=" + tmpAttr Val+"\n"; //各个属性之间用逗号分隔
548.}while(pAttr = pAttr->Next());
549.
550.//tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_l ast_of(","));
551.}
552.
553.//tmpAttrMsg += "]";
554.msg += tmpAttrMsg;
555.
556.return msg;
557.}
558.
559.
560.
561.
562./******************************************************** ****************/
563./* 在指定位置插入一个元素 */
564./******************************************************** ****************/
565.bool insertAElement(const char * cXmlName, TiXmlEle ment * pElement)
566.{
567.//加载一个XML的文档对象。
568.TiXmlDocument *xmlDoc = new TiXmlDocument(cXml Name);
569.xmlDoc->LoadFile();
570.
571.if(xmlDoc == NULL)
572.{
573.return false;
574.}
575.
576.//获得xml的头,即声明部分
577.TiXmlDeclaration* decl = xmlDoc->FirstChild()->ToDe claration();
578.if(decl != NULL)
579.{
580.cout << "xml文件的版本是:" << decl->Version() << endl;
581.cout << "xml的编码格式是:" << decl->Encoding() << endl;
582.}
583.//获得根元素
584.TiXmlElement *RootElement = xmlDoc->RootElement( );
585.if(RootElement != NULL)
586.{
587.TiXmlNode * pNode = SelectSingleNode(cXmlName," name","length","100");
588.if(pNode == NULL)
589.{
590.return false;
591.}
592.
593.//创建一个Person元素并连接。
594.TiXmlElement *pNewElement = new TiXmlElement("Pe rson");
595.if(pNewElement == NULL)
596.{
597.return false;
598.}
599.pNewElement->SetAttribute("Id","1");
600.TiXmlText *textElement = new TiXmlText("gbnn");
601.if(textElement == NULL)
602.{
603.return false;
604.}
605.pNewElement->LinkEndChild(textElement);
606.TiXmlNode * pRet = pNode->InsertBeforeChild(pNod e->LastChild(),*pNewElement);
607.//TiXmlNode * pRet = pNode->LinkEndChild(pNewEle ment);
608.xmlDoc->Print();
609.bool b = xmlDoc->SaveFile();
610.if(b)
611.{
612.cout << "添加成功" << endl;
613.return b;
614.}
615.else
616.{
617.cout << "添加失败" << endl;
618.return false;
619.}
620.}
621.else
622.{
623.return false;
624.}
625.}
626.
627.//const char * cXmlName,string strNodeName,string s trNodeAttrName,string strNdeAttrValue,string strPath 628./*!
629.* \Function: 修改一个唯一节点中第二、三属性的值为一子符串
630.*
631.* \param cXmlName xml文件名
632.* \param strNodeName 指定的节点名。
633.* \param strNodeAttrName 指定的节点名所在节点中第一属性名。
634.* \param strNdeAttrValue 指定的节点名所在节点中第一属性值。
635.* \param strPath 字符串。
为当前路径名的上一级目录的字符串
636.* \return 是否成功。
true为成功,false表示失败。
637.*/
638.bool ModifySingleNode(const char * cXmlName,string strNodeName,string strNodeAttrName,string strNdeAttrValue,s tring strPath)
639.{
640.if (strNodeName.empty() || strNodeAttrName.empty() || strNdeAttrValue.empty() ||strPath.empty())
641.{
642.return false;
643.}
644.
645.// 定义一个TiXmlDocument类指针
646.TiXmlDocument *pDoc = new TiXmlDocument();
647.if (NULL==pDoc)
648.{
649.return false;
650.}
651.
652.pDoc->LoadFile(cXmlName);
653.
654.TiXmlElement* pRootElement = pDoc->RootElement() ;
655.
656.TiXmlNode * pNode = SelectSingleNodeByRootEle(pR ootElement,strNodeName,strNodeAttrName,strNdeAttrValue);
657.
658.if (NULL == pNode)
659.{
660.return false;
661.}
662.
663.//输出属性
664.TiXmlElement * pElement = pNode->ToElement();
665.
666.TiXmlAttribute * pAttr = pElement->FirstAttribute();
667.TiXmlAttribute * pNextAttr =NULL;
668.
669.if(pAttr != NULL)
670.{
671.string tmpAttrVal = "";
672.string tmpAttrName = "";
673.
674.do
675.{
676.tmpAttrVal = pAttr->Value();
677.tmpAttrName = pAttr->Name();
678.
679.//节点中第一个属性对跳过
680.if (tmpAttrName == strNodeAttrName && tmpAttrVal == strNdeAttrValue)
681.{
682.continue;
683.}
684.
685.//修改第二和第三个属性对
686.if ("href" == tmpAttrName)
687.{
688.pAttr->SetValue(strPath.c_str());
689.}
690.
691.if ("test" == tmpAttrName)
692.{
693.pAttr->SetValue(strPath.c_str());
694.}
695.
696.}while(pAttr = pAttr->Next());
697.}
698.
699.pDoc->SaveFile("hhhhhhhhhhhhh.xml");
700.
701.return true;
702.}
703.
704.void ShowSingleNode(const char * cXmlName,string s trNodeName,string strNodeAttrName,string strNdeAttrValue) 705.{
706.TiXmlNode * pNode = SelectSingleNode(cXmlName,st rNodeName,strNodeAttrName,strNdeAttrValue);
707.
708.if (NULL == pNode)
709.{
710.return;
711.}
712.
713.string strTem = getAttribute(pNode);
714.
715.cout << strTem.c_str() << endl;
717.
718.string PathOpt()
719.{
720.char cStr[MAX_NUM];
721.GetCurrentDirectory(MAX_NUM,cStr);
722.
723.string str = cStr;
724.
725.//取当前路径的上一目录所在路径
726.size_t pos = str.find_last_of("\\");
727.str.erase(str.begin()+pos,str.end());
728.
729.return str;
730.}
731.
732.
733.int main()
734.{
735.const char * cXmlName = "files.xml";
736.string strPath;
737.//createXml(ccXmlName);
738.//readXml(cXmlName);
739.//insert(ccXmlName);
740.//readXml(ccXmlName);
741.
742.ShowSingleNode(cXmlName,"Document","title","Abou t VMware Player Help");
743.
744.strPath = PathOpt();
746.bool ret = ModifySingleNode(cXmlName,"Document", "title","About VMware Player Help",strPath);
747.
748.if (ret)
749.{
750.cout << "OK" << endl;
751.}
752.else
753.{
754.cout << "false" << endl;
755.}
756.
757.ShowSingleNode("hhhhhhhhhhhhh.xml","Document", "title","About VMware Player Help");
758.return 0;
759.}。