材料:Window10+VS2015+tinyxml
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
①tinyxml下载
tinyxml官网下载链接
1.点击上方官网链接,进行下载,示例如下;
②tinyxml编译
- 1.将下载后的压缩包进行解压,得到tinyxml文件夹;
- 2.考虑到tinyxml库很小,本文直接将必要文件拷贝到C++工程目录下使用,具体操作示例如下;
- 3.在VS2015下,建立一个空的win32控制台工程,本文命名为XMLprocess;在附加包含目录中包含tinyxml文件夹;
配置属性–》C/C++–》常规–》附加包含目录,选择tinyxml;
- 4.将tinyxml文件夹下的tinyxml.h,tinystr.h,tinyxml.cpp,tinystr.cpp,tinyxmlerror.cpp,tinyxmlparse.cpp,xmltest.cpp七个源码文件拷贝到XMLprocess工程目录下,并加载到程序里;
- 5.在程序中添加头文件tinyxml.h;
- 6.常见问题解决方法;
(1)旧版本vs编写的tinyxml,用高版本打开需要升级,默认确定就行;
(2)xmltest.cpp报错;
- a. 1142行代码缺少一个双引号 " ,加上就行了;
- b. 1149行代码缺少一个双引号 " ,加上就行了;
- c. 1153行代码 XmlTest,直接注释掉;
③tinyxml类基本要素介绍
在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类。
TiXmlDocument:对应于XML的整个文档;
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong=“1.0” ?>;
TiXmlElement:对应于XML的元素;
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlText:对应于XML的文字部分;
TiXmlNode:对应于DOM结构中的节点;
TiXmlComment:对应于XML中的注释;
TiXmlUnknown:对应于XML的未知部分;
TiXmlHandler:定义了针对XML的一些操作。
③tinyxml的读写增删改
1.本文使用示例01.xml文件如下;
<School name="超神学院">
<Class name = "C++">
<Student name="joe" number="00001">
<email>joe@edu.com</email>
<address>china</address>
</Student>
<Student name="tom" number="00002">
<email>tom@edu.com</email>
<address>america</address>
</Student>
</Class>
</School>
2.读取整个xml文件并打印代码:
void printSchoolXml() {
using namespace std;
TiXmlDocument doc;
const char * xmlFile = "01.xml";
if (doc.LoadFile(xmlFile)) {
doc.Print();
} else {
cout << "can not parse xml 01.xml" << endl;
}
}
3.读取整个xml文件内容:
void readSchoolXml() {
using namespace std;
const char * xmlFile = "01.xml";
TiXmlDocument doc;
if (doc.LoadFile(xmlFile)) {
doc.Print();
} else {
cout << "can not parse xml 01.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;
}
}
}
4.写入xml内容;
void writeSchoolXml() {
using namespace std;
const char * xmlFile = "01.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", "joe");
stu1Element->SetAttribute("number", "00001");
TiXmlElement * stu1EmailElement = new TiXmlElement("email");
stu1EmailElement->LinkEndChild(new TiXmlText("joe@edu.com") );
TiXmlElement * stu1AddressElement = new TiXmlElement("address");
stu1AddressElement->LinkEndChild(new TiXmlText("china"));
stu1Element->LinkEndChild(stu1EmailElement);
stu1Element->LinkEndChild(stu1AddressElement);
TiXmlElement * stu2Element = new TiXmlElement("Student");
stu2Element->SetAttribute("name", "tom");
stu2Element->SetAttribute("number", "00002");
TiXmlElement * stu2EmailElement = new TiXmlElement("email");
stu2EmailElement->LinkEndChild(new TiXmlText("tom@edu.com"));
TiXmlElement * stu2AddressElement = new TiXmlElement("address");
stu2AddressElement->LinkEndChild(new TiXmlText("america"));
stu2Element->LinkEndChild(stu2EmailElement);
stu2Element->LinkEndChild(stu2AddressElement);
classElement->LinkEndChild(stu1Element);
classElement->LinkEndChild(stu2Element);
schoolElement->LinkEndChild(classElement);
doc.LinkEndChild(decl);
doc.LinkEndChild(schoolElement);
doc.SaveFile(xmlFile);
}
5.xml的删除;
(1)删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown\TiXmlDocument的基类;
TiXmlNode node;
node.Clear();
(2)从A节点上移除子节点B
TiXmlNode nodeA;
nodeA. RemoveChild( TiXmlNode* removeThis );
(3)从元素A上移除名字为B的属性
TiXmlAttribute attrA;
attrA. RemoveAttribute( const char * name );
6.xml的删除;
(1)查找内容为mfid val=“1234” / ,现需要将1234改成其他值;
TiXmlNode* lpnode = NULL;
lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode);
TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute();
//找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的
tiattr->SetValue(mfid.c_str());
(2)替换一个节点;
TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );