网上有很多C++读取xml文件的, 但是针对性较强,读的文件属性特征详细,针对属性特征不详细,且数据之间关系为多个并列的情况,很少有说明,这里给出自己研究的过程, 代码附上!仅供参考!原创文章,非法使用必究!
忘了添加,准备工作了, 需要上网下载。
tinyXml是一个免费开源的C++库,可以到官网上下载:https://sourceforge.net/projects/tinyxml/。
我是在windows下用VS来写C++的,按照@marchtea的说法,只需要直接打开tinyxml.sln就可以,笨办法如下://该准备工作操作部分转自 https://www.cnblogs.com/yyh1993/p/6130455.html,该博文的分析也给了我很多启发,很收益。
- 把tinystr.cpp, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.h, tinyxml.h拷贝到工程目录下;
- 然后加入头文件引用:#include "tinystr.h" #include "tinyxml.h"。
//test
//if (atof(mark_id->GetText()) == 4)
//{
// Chinese_name = mark_id->NextSiblingElement(); // mark_id 下一个子节点
// English_name = Chinese_name->NextSiblingElement(); // Chinese_name 下一个子节点
// Parent_ion = English_name->NextSiblingElement(); // English_name 下一个子节点
// DaughterNum = Parent_ion->NextSiblingElement(); // Parent_ion 下一个子节点
// Daughter_Ion = DaughterNum->NextSiblingElement(); // DaughterNum 下一个子节点
// Daughter = Daughter_Ion->FirstChildElement(); //获得Daughter_ion的第一个子元素
// string TypeMark_id = mark_id->Value();
// string Mark_idValue = mark_id->GetText();
// cout << TypeMark_id << " : " << Mark_idValue << std::endl;
// string TypeChinese_name = Chinese_name->Value();
// string Chinese_nameValue = Chinese_name->GetText();
// cout << TypeChinese_name << " : " << Chinese_nameValue << std::endl;
//}
#include "tinystr.h" #include "tinyxml.h" #include<stdio.h> #include <string> #include <iostream> using namespace std; void printSchoolXml(); void readSchoolXml(); int main(int argc, char** argv) { printSchoolXml(); readSchoolXml(); return 0; } void printSchoolXml() { using namespace std; TiXmlDocument doc; const char * xmlFile = "read_xml_test.cpp//MassSpectrumLab.xml"; if (doc.LoadFile(xmlFile)) { doc.Print(); } else { cout << "can not parse xml conf/school.xml" << endl; } } void readSchoolXml() { TiXmlDocument doc;//申明一个文档类型变量,用来存储读取的xml文档 if (!doc.LoadFile("MassSpectrumLab.xml")) //检测xml文档是否存在 { cerr << doc.ErrorDesc() << endl; } TiXmlElement* MassSpectrumLab = doc.FirstChildElement();//指向xml文档的根元素 if (MassSpectrumLab == NULL)//检测根元素存在性 { cerr << "Failed to load file: No root element." << endl; doc.Clear(); } else { TiXmlElement* mark_id = MassSpectrumLab->FirstChildElement(); // xml的id 根节点下第一个子节点 TiXmlElement* Chinese_name = mark_id->NextSiblingElement(); // mark_id 下一个子节点 TiXmlElement* English_name = Chinese_name->NextSiblingElement(); // Chinese_name 下一个子节点 TiXmlElement* Parent_ion = English_name->NextSiblingElement(); // English_name 下一个子节点 TiXmlElement* DaughterNum = Parent_ion->NextSiblingElement(); // Parent_ion 下一个子节点 TiXmlElement* Daughter_Ion = DaughterNum->NextSiblingElement(); // DaughterNum 下一个子节点 TiXmlElement* Daughter = Daughter_Ion->FirstChildElement();//获得Daughter_ion的第一个子元素 int temp = 0; while (mark_id != NULL) { temp++;
cout << temp << endl; Chinese_name = mark_id->NextSiblingElement(); // mark_id 下一个子节点 English_name = Chinese_name->NextSiblingElement(); // Chinese_name 下一个子节点 Parent_ion = English_name->NextSiblingElement(); // English_name 下一个子节点 DaughterNum = Parent_ion->NextSiblingElement(); // Parent_ion 下一个子节点 Daughter_Ion = DaughterNum->NextSiblingElement(); // DaughterNum 下一个子节点 Daughter = Daughter_Ion->FirstChildElement(); //获得Daughter_ion的第一个子元素 string TypeMark_id = mark_id->Value(); string Mark_idValue = mark_id->GetText(); cout << TypeMark_id << " : " << Mark_idValue << std::endl; string TypeChinese_name = Chinese_name->Value(); string Chinese_nameValue = Chinese_name->GetText(); cout << TypeChinese_name << " : " << Chinese_nameValue << std::endl; string TypeEnglish_name = English_name->Value(); string English_nameValue = English_name->GetText(); cout << TypeEnglish_name << " : " << TypeEnglish_name << std::endl; string TypeParent_ion = Parent_ion->Value(); string Parent_ionValue = Parent_ion->GetText(); cout << TypeParent_ion << " : " << TypeParent_ion << std::endl; string TypeDaughterNum = DaughterNum->Value(); string DaughterNumValue = DaughterNum->GetText(); cout << TypeDaughterNum << " : " << DaughterNumValue << std::endl; for (; Daughter != NULL; Daughter = Daughter->NextSiblingElement()) { string contactType = Daughter->Value(); string contactValue = Daughter->GetText(); cout << contactType << " : " << contactValue << std::endl; } mark_id = Daughter_Ion->NextSiblingElement(); } cout << temp << endl; } }
xml文件为
<MassSpectrumLab>
<mark_id>0</mark_id>
<Chinese_name>利血平</Chinese_name>
<English_name>Reserpine </English_name>
<Parent_ion>609.2</Parent_ion>
<DaughterNum>4</DaughterNum>
<Daughter_Ion>
<Daughter>397</Daughter>
<Daughter>448</Daughter>
<Daughter>436</Daughter>
<Daughter>577</Daughter>
</Daughter_Ion>
<mark_id>1</mark_id>
<Chinese_name>硫代艾地那非</Chinese_name>
<English_name>Thioaildenafil</English_name>
<Parent_ion>505</Parent_ion>
<DaughterNum>4</DaughterNum>
<Daughter_Ion>
<Daughter>393</Daughter>
<Daughter>448</Daughter>
<Daughter>327</Daughter>
<Daughter>299</Daughter>
</Daughter_Ion>
<mark_id>2</mark_id>
<Chinese_name>红地那非</Chinese_name>
<English_name>Hongdenafil</English_name>
<Parent_ion>467</Parent_ion>
<DaughterNum>5</DaughterNum>
<Daughter_Ion>
<Daughter>420</Daughter>
<Daughter>396</Daughter>
<Daughter>449</Daughter>
<Daughter>353</Daughter>
<Daughter>439</Daughter>
</Daughter_Ion>
<mark_id>3</mark_id>
<Chinese_name>伪伐地那非</Chinese_name>
<English_name>Pseudovardenafil</English_name>
<Parent_ion>460</Parent_ion>
<DaughterNum>5</DaughterNum>
<Daughter_Ion>
<Daughter>432</Daughter>
<Daughter>377</Daughter>
<Daughter>299</Daughter>
<Daughter>312</Daughter>
<Daughter>329</Daughter>
</Daughter_Ion>
<mark_id>4</mark_id>
<Chinese_name>瑞格列奈</Chinese_name>
<English_name>Repaglinide </English_name>
<Parent_ion>453</Parent_ion>
<DaughterNum>3</DaughterNum>
<Daughter_Ion>
<Daughter>162</Daughter>
<Daughter>230</Daughter>
<Daughter>292</Daughter>
</Daughter_Ion>
</MassSpectrumLab>