服务器之家

服务器之家 > 正文

c++中用TINYXML解析XML文件

时间:2021-09-09 15:32     来源/作者:WindSun

TinyXML介绍

最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

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的一些操作。

下载和编译

下载地址:http://sourceforge.net/projects/tinyxml/

工作目录为:

?
1
2
3
4
5
6
7
8
tinyxml/      //工作目录
|-- include    //头文件根目录
|  |-- tinyxml  //tinyxml头文件,包括tinystr.h tinyxml.h
|-- src      //cpp源码文件根目录
  |-- tinyxml    //tinyxml源码文件夹,包括tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp
  |-- main.cpp  //我们的主函数,调用tinyxml的示例代码
|-- conf      //我们示例中用的xml文件所在的文件夹
|-- makefile    //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践

简单的例子

在conf目录下建立student.xml代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<School name="软件学院">
  
  <Class name = "C++">
    
    <Student name="tinyxml" number="123">
      <email>tinyxml@163.com</email>
      <address>中国</address>     
    </Student>
    
    <Student name="jsoncpp" number="456">
      <email>jsoncpp@gmail.com</email>
      <address>美国</address>     
    </Student>
    
  </Class>
  
</School>

想要使用tinyxml,只需要在头文件中包含<tinyxml.h>即可

读取整个xml文件并打印代码:

?
1
2
3
4
5
6
7
8
9
10
void printSchoolXml() {
  using namespace std;
  TiXmlDocument doc;
  const char * xmlFile = "conf/school.xml"
  if (doc.LoadFile(xmlFile)) { 
    doc.Print();
  } else {
    cout << "can not parse xml conf/school.xml" << endl;
  
}

读取XML

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void readSchoolXml() {
  using namespace std;
  const char * xmlFile = "conf/school.xml";
  TiXmlDocument doc;              
  if (doc.LoadFile(xmlFile)) {
    doc.Print();
  } else {
    cout << "can not parse xml conf/school.xml" << endl;
    return;
  }
  
  TiXmlElement* rootElement = doc.RootElement(); //School元素
  TiXmlElement* classElement = rootElement->FirstChildElement(); // Class元素
  TiXmlElement* studentElement = classElement->FirstChildElement(); //Students
  
  for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) {
    TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //获得student的name属性
    for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) {
      cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;   
    }                
 
    TiXmlElement* studentContactElement = studentElement->FirstChildElement();//获得student的第一个联系方式
    
    for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {
      string contactType = studentContactElement->Value();
      string contactValue = studentContactElement->GetText();
      cout << contactType << " : " << contactValue << std::endl;     
    
  }
}

写入xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void writeSchoolXml() {
  using namespace std;
  const char * xmlFile = "conf/school-write.xml";
  
  TiXmlDocument doc;
  TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");
  TiXmlElement * schoolElement = new TiXmlElement( "School" );
  TiXmlElement * classElement = new TiXmlElement( "Class" );
  classElement->SetAttribute("name", "C++");
 
  TiXmlElement * stu1Element = new TiXmlElement("Student");
  stu1Element->SetAttribute("name", "tinyxml");
  stu1Element->SetAttribute("number", "123");
  TiXmlElement * stu1EmailElement = new TiXmlElement("email");
  stu1EmailElement->LinkEndChild(new TiXmlText("tinyxml@163.com") );
  TiXmlElement * stu1AddressElement = new TiXmlElement("address");
  stu1AddressElement->LinkEndChild(new TiXmlText("中国"));
  stu1Element->LinkEndChild(stu1EmailElement);
  stu1Element->LinkEndChild(stu1AddressElement);
 
  TiXmlElement * stu2Element = new TiXmlElement("Student");
  stu2Element->SetAttribute("name", "jsoncpp");
  stu2Element->SetAttribute("number", "456");
  TiXmlElement * stu2EmailElement = new TiXmlElement("email");
  stu2EmailElement->LinkEndChild(new TiXmlText("jsoncpp@163.com"));
  TiXmlElement * stu2AddressElement = new TiXmlElement("address");
  stu2AddressElement->LinkEndChild(new TiXmlText("美国"));
  stu2Element->LinkEndChild(stu2EmailElement);
  stu2Element->LinkEndChild(stu2AddressElement);
 
  classElement->LinkEndChild(stu1Element);
  classElement->LinkEndChild(stu2Element);
  schoolElement->LinkEndChild(classElement);
  
  doc.LinkEndChild(decl);
  doc.LinkEndChild(schoolElement);
  doc.SaveFile(xmlFile);
}

XML删除操作

删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、

TiXmlDocument的基类

?
1
2
TiXmlNode node;
node.Clear();

从A节点上移除子节点B

?
1
2
TiXmlNode nodeA;
nodeA. RemoveChild( TiXmlNode* removeThis );

从元素A上移除名字为B的属性

?
1
2
TiXmlAttribute attrA;
attrA. RemoveAttribute( const char * name );

XML修改操作

查找内容为<mfid val="1234" />现需要将1234改成其他值

?
1
2
3
4
5
TiXmlNode* lpnode = NULL;
lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode);
TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute();
//找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的
tiattr->SetValue(mfid.c_str());

替换一个节点

?
1
TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );

以上就是c++中用TINYXML解析XML文件的详细内容,更多关于c++ tinyxml解析XML的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/WindSun/p/11291515.html

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部