网上有很多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>
