网上介绍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!
写的很简单,不过希望对大家有用。