首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

tinyxml应用笔记与总结[转]

2012-10-26 
tinyxml使用笔记与总结[转]在TinyXML中,根据XML的各种元素来定义了一些类:??????? TiXmlBase:整个TinyXML

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应用笔记与总结[转]<?xml?version="1.0"?standalone=no>
tinyxml应用笔记与总结[转]<!–?Our?to?do?list?data?–>
tinyxml应用笔记与总结[转]<ToDo>
tinyxml应用笔记与总结[转]<Item?priority="1">?Go?to?the?<bold>Toy?store!</bold></Item>
tinyxml应用笔记与总结[转]<Item?priority="2">?Do?bills</Item>
tinyxml应用笔记与总结[转]</ToDo>?



整个对象树:

TiXmlDocument "demo.xml"
TiXmlDeclaration "version=’1.0′" "standalone=no"
TiXmlComment " Our to do list data"
TiXmlElement "ToDo"
TiXmlElement "Item" Attribtutes: priority = 1
TiXmlText "Go to the "
TiXmlElement "bold"
TiXmlText "Toy store!"
TiXmlElement "Item" Attributes: priority=2
TiXmlText "Do bills"

在tinyXML中,用FirstChild("名字")查找节点时,调用FirstChild函数的节点与要查找的节点必须成“父子关系”。

句柄

想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码:

?

tinyxml应用笔记与总结[转]TiXmlElement*?root?=?document.FirstChildElement(?"Document"?);
tinyxml应用笔记与总结[转]if?(?root?)
tinyxml应用笔记与总结[转]{
tinyxml应用笔记与总结[转]TiXmlElement*?element?=?root->FirstChildElement(?"Element"?);
tinyxml应用笔记与总结[转]if?(?element?)
tinyxml应用笔记与总结[转]{
tinyxml应用笔记与总结[转]TiXmlElement*?child?=?element->FirstChildElement(?"Child"?);
tinyxml应用笔记与总结[转]if?(?child?)
tinyxml应用笔记与总结[转]{
tinyxml应用笔记与总结[转]TiXmlElement*?child2?=?child->NextSiblingElement(?"Child"?);
tinyxml应用笔记与总结[转]if?(?child2?)
tinyxml应用笔记与总结[转]{
tinyxml应用笔记与总结[转]//?Finally?do?something?useful.?
tinyxml应用笔记与总结[转]



用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:

tinyxml应用笔记与总结[转]TiXmlHandle?docHandle(?&document?);
tinyxml应用笔记与总结[转]TiXmlElement*?child2?=?docHandle.FirstChild(?"Document"?).FirstChild(?"Element"?).Child(?"Child",?1?).ToElement();
tinyxml应用笔记与总结[转]if?(?child2?)
tinyxml应用笔记与总结[转]{
tinyxml应用笔记与总结[转]//?do?something?useful?
tinyxml应用笔记与总结[转]


一、读取XML,设置节点文本
如下XML片段:

tinyxml应用笔记与总结[转]<?xml?version="1.0"?encoding="UTF-8"?standalone="yes"??>
tinyxml应用笔记与总结[转]<ZXML>
tinyxml应用笔记与总结[转]????<ZAPP>
tinyxml应用笔记与总结[转]?????????<VBS_RUNTIME_PARAMS>
tinyxml应用笔记与总结[转]???????????????<BROADCAST_VERSION?info="版本">8</BROADCAST_VERSION>
tinyxml应用笔记与总结[转]???????????????<Broadcast>
tinyxml应用笔记与总结[转]????????????????<FileCount?info="资源文件个数">69</FileCount>
tinyxml应用笔记与总结[转]????????????????<SOURCE_1>
tinyxml应用笔记与总结[转]????????????????????<ID?info="图片编号">1</ID>
tinyxml应用笔记与总结[转]????????????????????<Version?info="图片版本">1</Version>
tinyxml应用笔记与总结[转]????????????????????<Path?info="图片路径">/mnt/share/1.bmp</Path>
tinyxml应用笔记与总结[转]????????????????????<FileMode?info="文件处理模式">0</FileMode>
tinyxml应用笔记与总结[转]????????????????</SOURCE_1>
tinyxml应用笔记与总结[转]????????????????<SOURCE_2>
tinyxml应用笔记与总结[转]????????????????????<Path?info="图片路径">/mnt/share/2.bmp</Path>
tinyxml应用笔记与总结[转]????????????????????<ID?info="图片编号">2</ID>
tinyxml应用笔记与总结[转]????????????????????<Version?info="图片版本">1</Version>
tinyxml应用笔记与总结[转]????????????????????<FileMode?info="文件处理模式">0</FileMode>
tinyxml应用笔记与总结[转]????????????????</SOURCE_2>
tinyxml应用笔记与总结[转]????????????????tinyxml应用笔记与总结[转]tinyxml应用笔记与总结[转].
tinyxml应用笔记与总结[转]????????????????</Broadcast>
tinyxml应用笔记与总结[转]?????????</VBS_RUNTIME_PARAMS>
tinyxml应用笔记与总结[转]????</ZAPP>
tinyxml应用笔记与总结[转]</ZXML>



要设置BROADCAST_VERSION节点的值 8为其他值,可参考如下代码(将值加1):
用ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )方法替换

tinyxml应用笔记与总结[转]??? TiXmlDocument?doc("zapp.conf");
tinyxml应用笔记与总结[转]????doc.LoadFile();
tinyxml应用笔记与总结[转]????TiXmlHandle?docHandle(?&doc?);
tinyxml应用笔记与总结[转]TiXmlElement*?Broadcast_ver?=?docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VERSION").ToElement();
tinyxml应用笔记与总结[转]????TiXmlNode?*?oldnode?=??Broadcast_ver->FirstChild();
tinyxml应用笔记与总结[转]??? const?char?*ver?=?Broadcast_ver->GetText();
tinyxml应用笔记与总结[转]????int?oldVer?=?atoi(ver);
tinyxml应用笔记与总结[转]????CString?newVer;
tinyxml应用笔记与总结[转]????newVer.Format("%d",oldVer+1);
tinyxml应用笔记与总结[转]????TiXmlText?newText(newVer);
tinyxml应用笔记与总结[转]????Broadcast_ver->ReplaceChild(oldnode,newText);
tinyxml应用笔记与总结[转]??? AfxMessageBox(Broadcast_ver->GetText());//输出值
tinyxml应用笔记与总结[转]??? doc.SaveFile();


二,删除节点,属性值

RemoveChild( TiXmlNode* removeThis )方法删除父节点的子节点,
RemoveAttribute( const char * name )方法删除属性值.

例如删除BROADCAST_VERSION节点

tinyxml应用笔记与总结[转]TiXmlHandle?docHandle(?&doc?);
tinyxml应用笔记与总结[转]????TiXmlElement*?Broadcast_ver?=?docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").ToElement();
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????TiXmlNode?*?node?=??Broadcast_ver->FirstChild("BROADCAST_VERSION");
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????Broadcast_ver->RemoveChild(node);


也可以删除整个SOURCE_1节点:

tinyxml应用笔记与总结[转]TiXmlHandle?docHandle(?&doc?);
tinyxml应用笔记与总结[转]????TiXmlElement*?Broadcast?=?docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????TiXmlNode?*?node?=??Broadcast->FirstChild("SOURCE_1");
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????Broadcast->RemoveChild(node);


删除BROADCAST_VERSION的info属性:

tinyxml应用笔记与总结[转]TiXmlHandle?docHandle(?&doc?);
tinyxml应用笔记与总结[转]????TiXmlElement*?Broadcast_ver?=?docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VERSION").ToElement();
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????Broadcast_ver->RemoveAttribute("info");?//删除info


可以借助NextSiblingElement()方法实现递归删除.

三,添加节点,属性值

例如在SOURCE_3下添加BROADCAST_PID节点:

tinyxml应用笔记与总结[转]TiXmlHandle?docHandle(?&doc?);
tinyxml应用笔记与总结[转]????TiXmlElement*?Broadcast?=?docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();
tinyxml应用笔记与总结[转]????TiXmlElement*?Broadcast_Pid?=?new?TiXmlElement("BROADCAST_PID");
tinyxml应用笔记与总结[转]????TiXmlText?*text?=new?TiXmlText("7215");
tinyxml应用笔记与总结[转]????Broadcast_Pid->SetAttribute("info","the?pid");
tinyxml应用笔记与总结[转]????Broadcast_Pid->LinkEndChild(text);
tinyxml应用笔记与总结[转]????Broadcast->LinkEndChild(Broadcast_Pid);


将在SOURCE_3后添加新的节点:

tinyxml应用笔记与总结[转]<BROADCAST_PID?info="the?pid">7215</BROADCAST_PID>


四,最后说一下中文乱码的问题

乱码是由于GB2312与UTF8之间转换不当造成的,tinyxml在处理UTF8本身没有问题,当你打开一个UTF8的文档,可以在加载的时候指定UTF8的方式,或者文档声明处指明的编码格式,tinyxml会按照相应的编码格式加载,但很多时候当我们输出或写入中文字段时会出现乱码,无论在内存,还是打印出来的内容.这是因为我们的软件通常是GB2312编码,而读取或写入的内容是UTF8,自然就会出错.可以借助网上的两个函数来实现转换(原作者不详):

tinyxml应用笔记与总结[转]????void?ConvertUtf8ToGBK(CString&?strUtf8)?
tinyxml应用笔记与总结[转]????{
tinyxml应用笔记与总结[转]????????int?len=MultiByteToWideChar(CP_UTF8,?0,?(LPCTSTR)strUtf8,?-1,?NULL,0);
tinyxml应用笔记与总结[转]????????unsigned?short?*?wszGBK?=?new?unsigned?short[len+1];
tinyxml应用笔记与总结[转]????????memset(wszGBK,?0,?len?*?2?+?2);
tinyxml应用笔记与总结[转]????????MultiByteToWideChar(CP_UTF8,?0,?(LPCTSTR)strUtf8,?-1,?wszGBK,?len);
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????????len?=?WideCharToMultiByte(CP_ACP,?0,?wszGBK,?-1,?NULL,?0,?NULL,?NULL);
tinyxml应用笔记与总结[转]????????char?*szGBK=new?char[len?+?1];
tinyxml应用笔记与总结[转]????????memset(szGBK,?0,?len?+?1);
tinyxml应用笔记与总结[转]????????WideCharToMultiByte?(CP_ACP,?0,?wszGBK,?-1,?szGBK,?len,?NULL,NULL);
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????????strUtf8?=?szGBK;
tinyxml应用笔记与总结[转]????????delete[]?szGBK;
tinyxml应用笔记与总结[转]????????delete[]?wszGBK;
tinyxml应用笔记与总结[转]????}
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????void?ConvertGBKToUtf8(CString&?strGBK)
tinyxml应用笔记与总结[转]????{
tinyxml应用笔记与总结[转]????????int?len=MultiByteToWideChar(CP_ACP,?0,?(LPCTSTR)strGBK,?-1,?NULL,0);
tinyxml应用笔记与总结[转]????????unsigned?short?*?wszUtf8?=?new?unsigned?short[len+1];
tinyxml应用笔记与总结[转]????????memset(wszUtf8,?0,?len?*?2?+?2);
tinyxml应用笔记与总结[转]????????MultiByteToWideChar(CP_ACP,?0,?(LPCTSTR)strGBK,?-1,?wszUtf8,?len);
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????????len?=?WideCharToMultiByte(CP_UTF8,?0,?wszUtf8,?-1,?NULL,?0,?NULL,?NULL);
tinyxml应用笔记与总结[转]????????char?*szUtf8=new?char[len?+?1];
tinyxml应用笔记与总结[转]????????memset(szUtf8,?0,?len?+?1);
tinyxml应用笔记与总结[转]????????WideCharToMultiByte?(CP_UTF8,?0,?wszUtf8,?-1,?szUtf8,?len,?NULL,NULL);
tinyxml应用笔记与总结[转]
tinyxml应用笔记与总结[转]????????strGBK?=?szUtf8;
tinyxml应用笔记与总结[转]????????delete[]?szUtf8;
tinyxml应用笔记与总结[转]????????delete[]?wszUtf8;
tinyxml应用笔记与总结[转]????}


当然,你也可以用MultiByteToWideChar,WideCharToMultiByte函数自己实现转换.以上是简单应用的几个举例,理解他们,相信你已经能写出满足自己需要的代码了.

热点排行