网上介绍TinyXml的例子很多,所以不用再介绍了。最近也需要解析XML,从网上找了一下,发现TinyXml是最合适的。
TinyXml同时支持Windows和Linux平台,而且它很小巧,功能也全面,包括对XML各种特性的操作。
不过美中不足,虽然网上的应用实例很多,但是大部分都是从文件中解析和把数据保存到文件中的。而我需要的是解析内存中的数据,并且需要把数据保存到内存中。
TinyXml的在线帮助文档URL:http://www.grinninglizard.com/tinyxml2docs/index.html
首先要提一下,TinyXml把Xml数据里面的标签、属性、声明、注释、值等都看做是“节点”,体现在数据结构里就是TiXmlNode。
因为条件限制,现在不能做测试用例,就把用法写一下吧,希望对大家有帮助。
从内存中加载数据:
const char *cszXml = "<?xml version="1.0"?><BOOK><BOOKNAME>XML</BOOKNAME></BOOK>"; TiXmlDocument doc; doc.Parse(cszXml); if (true == doc.Error()) { cout << "Parse XML data error: " << doc.ErrorDesc() << endl; return; }
将数据保存到内存中:
TinyXml可以将数据保存到文件,也可以打印到屏幕上,当然,也可以直接保存到内存中,其实也是应用的它的打印功能。
extern TiXmlDocument doc; //! XML文档 extern char szXml[]; //! 存放结果字符串 TiXmlPrinter printer; printer.VisitEnter(doc); // printer.SetIndent(""); //! 设置每行开头的标识符,默认是4个空格 // printer.SetLineBreak(""); //! 设置行分隔符,默认"\r\n" // !上面两行可以用这一行替代 printer.SetStreamPrinting(); //! 设置开头的标识符为"",行分隔符为"" sprintf(szXml, printer.CStr()); //! 将结果保存到szXml中,C风格字符串 //! int nSize = printer.Size(); //! 字符串长度
顺便捎带一句:
判断一个标签是否有子标签:
extern TiXmlElement xmlElem; if (xmlElem.FistChildElement() ) { // TODO: 有子标签 } else { // TODO: 没有子标签 }
GAME OVER!
写的很简单,不过希望对大家有用。