Xml文件解析器——TinyXml介绍及示例代码
前言
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。
这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
在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
下载地址是:http://sourceforge.net/projects/tinyxml/
解压之后得到文件夹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代码如下:
"软件学院"<
"C++"<
"tinyxml" number="123"<
tinyxml@163.com
中国
"jsoncpp" number="456"<
jsoncpp@gmail.com
美国
使用tinyxml,我们只需要在头文件中包含 就行了。
打印整个XML代码如下:
void printSchoolXml() {读取XML
usingnamespace std;
TiXmlDocument doc;
constchar * xmlFile = "conf/school.xml";
if (doc.LoadFile(xmlFile)) {
doc.Print();
} else {
cout < span style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(128, 0, 0);' >"can not parse xml conf/school.xml" < endlbr style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(0, 0, 0);' /> }
}
代码如下:
void readSchoolXml() {写入xml
usingnamespace std;
constchar * xmlFile = "conf/school.xml";
TiXmlDocument doc;
if (doc.LoadFile(xmlFile)) {
doc.Print();
} else {
cout < span style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(128, 0, 0);' >"can not parse xml conf/school.xml" < endlbr style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(0, 0, 0);' />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() < span style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(128, 0, 0);' >" : " < attributeOfStudent->Value() < stdendl br style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(0, 0, 0);' /> }
TiXmlElement* studentContactElement = studentElement-<FirstChildElement();//获得student的第一个联系方式
for (; studentContactElement != NULL; studentContactElement = studentContactElement-<NextSiblingElement() ) {
string contactType = studentContactElement-<Value();
string contactValue = studentContactElement-<GetText();
cout < contactType span style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(128, 0, 0);' >" : " < contactValue stdendl br style='font-size:12px;font-style:normal;font-weight:400;font-family:Courier New;color:rgb(0, 0, 0);' /> }
}
}
这里我们将通过xml写入代码操作,写入几乎和conf/school.xml同样内容到conf/school-write.xml,代码如下:
void writeSchoolXml() {下载工程
usingnamespace std;
constchar * 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);
}
点击下载
下载之后的编译和运行步骤
unzip tinyxml.zip
cd tinyxml
make
./main