windows客户端开发--使用tinyxml库解析xml文件

来源:互联网 发布:用js实现手机号 编辑:程序博客网 时间:2024/05/21 03:27


例如,微信windows客户端使用的duilib库中,界面就是用xml进行描述的。


所以,今天我们就来谈一谈windows客户端中,也就是C++中如何解析xml。


很多时候,我们都使用.ini文件来存储一些数据。


xml确实是有很多的优点,某种程度上来说也确实可以完全取代ini,但也并非如有些人鼓吹的处处都比ini强。

 xml,对于描述复杂的数据结构非常的方便,缺点相对ini使用麻烦一点。在表达较短的配置时,没有ini简练。而且因为它有比较严格的格式审查机制,容错性也不是特别好,在手写时容易出现错误。抛开配置的功能,作为存储传输数据的手段,xml还有个缺点就是它的处理和存储的效率非常低下,解析速度慢,占用更多的存储空间。

 ini,通常用于对软件的参数进行配置和记录。优点是使用方便,嵌入程序也容易,几个接口就够了,很容易掌握。配置文件更小巧,手工配置也更容易。缺点是它的结构只有2层,对于复杂类型数据描绘就显得比较无力了。另外ini文件有64kb的大小限制。

 对于很小的简单配置来说,ini无疑是一种更简练,方便的实现方式。而xml则适合应付更复杂的需求。

如何读写ini文件,我们之前的博客已经介绍过了,windows系统给我们提供了api。


现在就来讲讲如何解析xml.

这里,我们使用一个开源库叫做tinyxml

源码:

https://sourceforge.net/projects/tinyxml/点击打开链接。

源代码不长,我们可以直接引入源代码。

首先我们写一个xml。这里需要注意的是,推荐使用notepad++,而不是使用windows自带的记事本。

创建一个xml,test.xml

<?xml version="1.0" encoding="utf-8"?><Strings>  <!--system button-->  <String>    <StringKey>MinimizeTips</StringKey>    <StringValue>最小化</StringValue>  </String>    <String>    <StringKey>MaximizeTips</StringKey>    <StringValue>最大化</StringValue>  </String><Strings>


接下来,我们就是要把上面的xml读取出来,并以key-value的形式存入map中。map的使用我们也不再赘述,之前的博客有有过介绍。

首先是创建一个XMLDocument的对象;

然后就是通过xml的路径,导入文件

可以使用RootElement获得根节点

可以使用FirstChildElement获得第一个子节点

可以使用NextSiblingElement获得下一个节点

可以使用GetText方法获得节点中的字符串


void ReadXmlToMap(const std::string& path, std::map<std::string, std::string>& string_map){tinyxml2::XMLDocument doc;doc.LoadFile(path.c_str());tinyxml2::XMLElement *root = doc.RootElement();tinyxml2::XMLElement *node = root->FirstChildElement("String");while (node){tinyxml2::XMLElement *key_element = node->FirstChildElement();tinyxml2::XMLElement *value_element = key_element->NextSiblingElement();string_map.insert(std::pair<std::string, std::string>(key_element->GetText(), value_element->GetText()));node = node->NextSiblingElement();}}



1 0
原创粉丝点击