xml 1

该代码示例展示了如何在C++环境中使用MSXML2库将txt文件内容转换为XML格式。程序首先读取txt文件,解析每一行数据,然后利用DOMDocument对象创建XML结构,将数据组织成学生信息的XML文档。
摘要由CSDN通过智能技术生成

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("提示"));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值