C++讀取xml文件


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM