首页 > 技术文章 > C++读取xml文件

hjj-fighting 2019-01-29 15:39 原文

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

 

推荐阅读