txt2xml
在项目 -> 属性 -> C/C++->预处理器 -> 预处理器定中添加 _CRT_SECURE_NO_WARNINGS
------------------
Txt2XMLDlg.h
#include <vector>
#include <map>
#include <string>
using namespace std;
public:
struct st_Data
{
string strNum;
string strName;
string strCourse;
string strScore;
};
vector<st_Data> m_vecData;
map<string, vector<st_Data>> m_mapData;
----------------------
pch.h
#import < msxml6.dll >
--------------------------------
Txt2XMLDlg.cpp
#include <fstream>
#include <string>
using namespace std;
//OnInitDialog()
AfxOleInit();//初始化 COM。
//OnBnClickedButton1()
ifstream txtFile("D:\\考研\\复试\\专业面试\\读写XML\\test2.txt");
string strLine;
map<string, vector<st_Data>>::iterator iter;
while (getline(txtFile, strLine))
{
// 提取字段
char pNum[32] = { 0 };
char pName[32] = { 0 };
char pCourse[32] = { 0 };
char pScore[32] = { 0 };
sscanf(strLine.c_str(), "%[^,],%[^,],%[^,],%s", pNum, pName, pCourse, pScore);
// 添加到数据容器
st_Data data;
data.strNum = pNum;
data.strName = pName;
data.strCourse = pCourse;
data.strScore = pScore;
//m_vecData.push_back(data);
iter = m_mapData.find(data.strNum);
if (iter != m_mapData.end())
{
iter->second.push_back(data);
}
else
{
vector<st_Data> vecData;
vecData.push_back(data);
m_mapData[data.strNum] = vecData;
}
}
::CoInitialize(NULL);//必须加初始化,否则异常
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
if (!SUCCEEDED(hr))
{
MessageBox(_T(" 无法创建DOMDocument 对象,请检查是否安装了MS XMLParser 运行库! "));
return;
}
//根节点的名称为Students,创建元素并添加到文档中
xmlRoot = pDoc->createElement(_T("Students"));
pDoc->appendChild(xmlRoot);
//xmlRoot->appendChild(pDoc->createTextNode("\n\t"));
MSXML2::IXMLDOMElementPtr pNode;
MSXML2::IXMLDOMElementPtr pNodeTemp;
iter = m_mapData.begin();
for (iter = m_mapData.begin(); iter != m_mapData.end(); iter++)
{
xmlRoot->appendChild(pDoc->createTextNode("\n\t"));
string strNum = iter->first;
vector<st_Data>& vecData = iter->second;
//创建节点元素,以添加到根节点下,并保证子节点能添加到节点上,于是申请了2 个结点。
/*MSXML2::IXMLDOMElementPtr*/ pNode = pDoc->createElement("Student");//Student 保存每个学生信息
xmlRoot->appendChild(pNode);
pNode->appendChild(pDoc->createTextNode("\n\t\t"));
//学号等信息依次添加到Student上。
// 学号
pNodeTemp = pDoc->createElement("学号");
//pNodeTemp->Puttext((_bstr_t)(const char *)"201215121");
pNodeTemp->Puttext((_bstr_t)strNum.c_str());
pNode->appendChild(pNodeTemp);
pNode->appendChild(pDoc->createTextNode("\n\t\t"));
// 姓名
pNodeTemp = pDoc->createElement("姓名");
pNodeTemp->Puttext((_bstr_t)vecData[0].strName.c_str());
pNode->appendChild(pNodeTemp);
for (int i = 0; i < vecData.size(); i++)
{
pNode->appendChild(pDoc->createTextNode("\n\t\t"));
// 课程
//pNodeTemp = pDoc->createElement("课程名");
pNodeTemp = pDoc->createElement(vecData[i].strCourse.c_str());
pNodeTemp->Puttext((_bstr_t)vecData[i].strScore.c_str());
pNode->appendChild(pNodeTemp);
}
pNode->appendChild(pDoc->createTextNode("\n\t"));
}
xmlRoot->appendChild(pDoc->createTextNode("\n"));
//依次将所有信息写入到xml 中。
//最后保存xml 到文件中。
pDoc->save("D:\\考研\\复试\\专业面试\\读写XML\\test2.XML");
//释放各节点,并且反初始化。
pNode.Release();
pNodeTemp.Release();
xmlRoot.Release();
pDoc.Release();
::CoUninitialize();
MessageBox(_T("完成"), _T("提示"));