您的位置:首页 > 编程语言 > C语言/C++

C++ TinyXml操作

2015-05-31 09:39 369 查看
前言

  TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。

  这个解析库的模型通过解析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的一些操作。

  本文运行环境是: Redhat 5.5 + g++version 4.6.1 + GNU Make 3.81 + tinyxml_2_6_2

  解压之后得到文件夹tinyxml,tinyxml的头文件和cpp文件,都在这个文件夹,为了我们的管理我们的项目工程,我们还是把tinyxml做一个整理。

  由于tinyxml不仅支持Linux编译,同时也支持windows下编译,所以解压之后不仅有h文件,cpp文件,还有vc工程的一些工程文件,这里我们只在Linux上使用,所以只留下h文件和cpp文件,其他文件一概删除

  这里我列出整理后的工作目录:

  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,xml代码如下:

  

<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代码如下:
  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
  //代码如下:
  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;
  }www.cdtarena.com
  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

  这里我们将通过xml写入代码操作,写入几乎和conf/school.xml同样内容到conf/school-write.xml,代码如下:

  

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);
  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: