今天需要用到XML文件的解析,本来的想法是自己写一个解析器,但是写着写着突然想看看别人的XML解析器都是怎么写的。于是google了一下,别笑话我见识浅,直到今天才听说TinyXML这个东西。是个老外写的,在SourceForge上算是小有名气的一个工程,现在已经有Tinyxml-2了。

复习一下XML的几种常见的解析方法:
1. SAX。这种方法是基于事件驱动的,当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。占用内存比较小。

2. DOM。这种方法是基于XML文件树结构的解析。解析器读入整个文件,然后构建一个树结构,保存在内存中,然后就可以使用DOM接口来操作这个结构,进行各种Get和Set操作。占用内存比较大。

3. DOM4J。实际上这是Java的API,不过还是复习一下,以下是来自百度百科的摘抄

dom4j是一个JavaXML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连SunJAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。From:  http://baike.baidu.com/view/1460716.htm

4. JDOM。同样是Java的东西,貌似DOM4J看起来要厉害一些。

TinyXML的使用方法还是比较简单的(实际上是因为我用到的功能比较少,所以看起来很简单,TinyXML的功能是非常强大的)。

先来看一个XML:

   
   
   
   
  1. xml version="1.0" encoding="UTF-8" ?> 
  2. <files> 
  3.     <file priority="1"> 
  4.         <name>pictureOps.dllname> 
  5.         <version>1.0.1version> 
  6.     file> 
  7.     <file priority="2"> 
  8.         <name>upload.dllname> 
  9.         <version>1.0.2version> 
  10.     file> 
  11.     <file priority="3"> 
  12.         <name>update.dllname> 
  13.         <version>1.0.0version> 
  14.     file> 
  15. files> 

算是个比较典型的XML了。

那么要使用TinyXML来遍历这个文件,便可以使用以下代码:

   
   
   
   
  1. char filePath[20] = "c:\\test.xml"; 
  2. TiXmlDocument * myDocument = new TiXmlDocument(filePath); 
  3. ASSERT(myDocument); 
  4.  
  5. myDocument->LoadFile(); 
  6. //获得一个根元素
  7. TiXmlElement * rootElement = myDocument->RootElement(); 
  8. ASSERT(rootElement); 
  9.  
  10. TiXmlElement * fileElement; 
  11. TiXmlElement * nameElement; 
  12. TiXmlElement * versionElement; 
  13. //获得一个file元素
  14. fileElement = rootElement->FirstChildElement(); 
  15. ASSERT(fileElement); 
  16.  
  17. do  
  18. //获得一个name元素
  19.     nameElement = fileElement->FirstChildElement(); 
  20.     ASSERT(nameElement); 
  21. //获得一个version元素
  22.     versionElement = nameElement->NextSiblingElement(); 
  23.     ASSERT(versionElement); 
  24.  
  25. #ifdef DEBUG 
  26.     CString temp(fileElement->Attribute("priority")); 
  27.     MessageBox(temp); 
  28.     temp = nameElement->GetText(); 
  29.     MessageBox(temp); 
  30.     temp = versionElement->GetText(); 
  31.     MessageBox(temp); 
  32. #endif 
  33. }  
  34. //继续获得下一个file元素
  35. while (fileElement = fileElement->NextSiblingElement()); 
  36.  
  37. rootElement->Clear(); 
  38. delete myDocument; 

首先使用LoadFile方法来加载XML文件,TiXmlDocument类会自动将XML文件的树结构保存在内存中。

接下来需要使用TiXmlElement类来逐个获得XML文件中的元素。

TiXmlElement * rooElement = myDocument->RootElement(); 这条语句会获得“根元素”,也就是***

fileElement = rootElement->FirstChildElement(); 这条语句会获得“根元素”中的子元素,也就是***

versionElement = nameElement->NextSiblingElement(); 这条语句会获得与name元素同级的元素。***

GetValue()可以获得当前元素的名称,此例中就是"files" "file" "name" "version"。

GetText()可以获得当前标签的内容,此例是中就是"pictureOps.dll"等。

使用完记得释放rootElement->Clear();

TinyXML不只可以解析,也可以生成XML文件。

   
   
   
   
  1. TiXmlDocument *myDocument = new TiXmlDocument();  
  2. //创建一个根元素并连接。  
  3. TiXmlElement *rootElement = new TiXmlElement("files");  
  4. myDocument->LinkEndChild(rootElement);  
  5. //创建一个file元素并连接。  
  6. TiXmlElement *fileElement = new TiXmlElement("file");  
  7. rootElement->LinkEndChild(fileElement);  
  8. //设置file元素的属性。  
  9. fileElement->SetAttribute("priority", 1);  
  10. //创建name元素、version元素并连接。  
  11. TiXmlElement *nameElement = new TiXmlElement("name");  
  12. TiXmlElement *versionElement = new TiXmlElement("version");  
  13. fileElement->LinkEndChild(nameElement);  
  14. fileElement->LinkEndChild(versionElement);  
  15. //设置name元素和version元素的内容并连接。  
  16. TiXmlText *nameContent = new TiXmlText("pictureOps.dll");  
  17. TiXmlText *versionContent = new TiXmlText("1.0.1");  
  18. nameElement->LinkEndChild(nameContent);  
  19. versionElement->LinkEndChild(versionContent);  
  20.  
  21. myDocument->SaveFile("c:\\test.xml");//保存到文件
  22. delete myDocument;

建立各种各样的TiXmlElement对象,然后通过LinkEndChild(TiXmlElement *)方法将元素按照结构进行连接。如果某一个元素有属性的话,可以使用SetAttribute()方法进行设置。最后使用SaveFile()方法将XML文件保存。