最近对XML有了些兴趣,准备稍稍涉猎一下。百度了相关的文章,试着写了一个程序,记录下来以资备忘。

    我的开发环境:Win7 32位OS、VS2012。


    OK,开始动手。

    PS:至于相关理论之类的就让大神大仙大侠大牛们去操心吧,我么就秉承拿来主义,能用就行啦。


    启动Visual Studio 2012。

    【文件】→【新建】→【项目】

    VC MSXML 操作 XML 入门_C/C++

    新建一个“MfcXmlTest”的MFC项目。【确定】

    VC MSXML 操作 XML 入门_MSXML_02

    【下一步】

    VC MSXML 操作 XML 入门_MSXML_03

    选中“基于对话框”,取消“使用Unicode库”。可直接【完成】

    PS:Unicode对中文支持不是很好。

    

    热身完成,开始进入正题。

    先画一个简单的程序界面。

    VC MSXML 操作 XML 入门_C/C++_04

    里面添加了中文,测试是否对中文支持。

    各控件属性:

控件ID变量类型
变量名称
IDC_EDIT_IDCStringm_strId
IDC_EDIT_BOOKCStringm_strBook
IDC_EDIT_AUTHORCStringm_strAuthor
IDC_BUTTON_GENERATE生成XML
IDC_BUTTON_LOAD加载XML


    进入代码编写阶段。

    在StdAfx.h中引入动态链接库 MSXML6.DLL(C:/windows/system32/msxml6.dll)

    可在文件最后添加:

// Win7系统自带MSXML6版本,不同OS请依照对应的版本,也可自行安装
#import <msxml6.dll>


    双击“生成XML”按钮,完成如下代码:

// 按钮:生成XML
void CMfcXmlTestDlg::OnBnClickedButtonGenerate()
{
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(TRUE);
	MSXML2::IXMLDOMDocumentPtr pDoc;					// xml文档
	MSXML2::IXMLDOMElementPtr xmlRoot;					// 根节点
	MSXML2::IXMLDOMElementPtr pElement, pElement1;		// 元素
	MSXML2::IXMLDOMNodePtr pNode=NULL;					// 节点
	MSXML2::IXMLDOMProcessingInstructionPtr pProInstruction = NULL;		// xml声明

	// 创建DOMDocument对象
	HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));	// MSXML6版本
	if (!SUCCEEDED(hr))
	{
		MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
		return;
	}

	// 创建xml文档声明:<?xml version="1.0" encoding="utf-8"?>
	pProInstruction = pDoc->createProcessingInstruction((_bstr_t)(char*)"xml", (_bstr_t)(char*)"version=\"1.0\" encoding=\"utf-8\"");
	pDoc->appendChild(pProInstruction);

	// 根节点的名称为:图书馆
	xmlRoot = pDoc -> createElement((_bstr_t)"图书馆");
	pDoc -> PutRefdocumentElement(xmlRoot);


/*	-------- 运行结果 --------
	<?xml version="1.0" encoding="utf-8"?>
	<图书馆>
	  <Book ID="321">
		<书名>BookName</书名>
		<作者>BookAuthor</作者>
	  </Book>
	</图书馆>
*/
	// 节点的名称为Book
	pElement = pDoc -> createElement((_bstr_t)"Book");
	// 设置属性
	pElement -> setAttribute( "ID" ,( const char * )m_strId);
	xmlRoot -> appendChild(pElement);

	// 添加“书名”元素
	pElement1 = pDoc -> createElement((_bstr_t) "书名" );
	pElement1 -> Puttext((_bstr_t)( const char * )m_strBook);
	pElement -> appendChild(pElement1);

	// 添加“作者”元素
	pElement1 = pDoc -> createElement( "作者" );
	pElement1 -> Puttext(( const   char   * )m_strAuthor);
	pElement -> appendChild(pElement1);


/*	-------- 运行结果 --------
	<图书馆>
	  <Book>
		<ID>123</ID>
		<书名>BookName</书名>
		<作者>BookAuthor</作者>
	  </Book>
	</图书馆>

	// 添加“Book”节点
	pNode = pDoc->createNode((_variant_t)(long)NODE_ELEMENT, (_bstr_t)(char*)"Book", (_bstr_t)(char*)"");
	xmlRoot -> appendChild(pNode);

	// 添加“ID”元素
	pElement = pDoc -> createElement((_bstr_t) "ID" );
	pElement -> Puttext((_bstr_t)( const char * )m_strId);
	pNode -> appendChild(pElement);

	// 添加“书名”元素
	pElement = pDoc -> createElement((_bstr_t) "书名" );
	pElement -> Puttext((_bstr_t)( const char * )m_strBook);
	pNode -> appendChild(pElement);

	// 添加“作者”元素
	pElement = pDoc -> createElement( "作者" );
	pElement -> Puttext(( const   char   * )m_strAuthor);
	pNode -> appendChild(pElement);
*/

	// 保存到文件。如果不存在就建立,存在就覆盖
	pDoc -> save("d://Book.xml");
}


    双击“加载XML”按钮,完成如下代码:

// 按钮:加载XML
void CMfcXmlTestDlg::OnBnClickedButtonLoad()
{
	// TODO: 在此添加控件通知处理程序代码

/*	-------- XML 内容 --------
	<?xml version="1.0" encoding="utf-8"?>
	<图书馆>
	  <Book ID="321">
		<书名>BookName</书名>
		<作者>BookAuthor</作者>
	  </Book>
	</图书馆>
*/

	// 清空控件内容
	m_strId.Empty();
	m_strBook.Empty();
	m_strAuthor.Empty();
	UpdateData(FALSE);								// 变量值—>控件显示

	MSXML2::IXMLDOMDocumentPtr pDoc;
	HRESULT hr;

	hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
	if (FAILED(hr))
	{
		MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
		return;
	}
	
	// 加载文件
	pDoc -> load("d://Book.xml");

	// 选择内容的根节点
	MSXML2::IXMLDOMElementPtr pElem = NULL;
	pElem = pDoc -> selectSingleNode("//图书馆");
	if(pElem==NULL)
	{
		return;
	}

	// 搜索“图书馆”中“Book”的数量(本例只有一本)
	int nBookNum = pElem->childNodes->length;
	if( nBookNum == 0)
	{
		return;
	}

	// 遍历所有Book
	for(int i=0; i < nBookNum; i++)
	{
		MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i];
		if(pBookNode==NULL)
		{
			return;
		}

		//读取Book节点的“ID”属性
		MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("ID");
		m_strId=(LPCTSTR)pId->text;					// 类型转换 _bstr_t → CString

		//读取book节点下“书名”子节点
		MSXML2::IXMLDOMNodePtr pBook = pBookNode->selectSingleNode("书名");
		if(pBook==NULL)
		{
			//cout<<"Author: Error\t";
		}
		else
		{
			m_strBook=(LPCTSTR)pBook->text;
		}

		//读取book节点下“作者”子节点
		MSXML2::IXMLDOMNodePtr pAuthor = pBookNode->selectSingleNode("作者");
		if(pAuthor==NULL)
		{
			//cout<<"Author: Error\t";
		}
		else
		{
			m_strAuthor=(LPCTSTR)pAuthor->text;
		}
	}	// for(int i=0; i < nBookNum; i++)

	UpdateData(FALSE);
}


    到了激动人心的最终时刻啦!

    按下F7生成程序,如果一切顺利,再按下F5走起。

    运行效果如图:

    VC MSXML 操作 XML 入门_XML_05

    \(≧▽≦)/~啦啦啦VC MSXML 操作 XML 入门_XML_06


    本人调试的时候也蹦出了一个异常:

    VC MSXML 操作 XML 入门_MSXML_07

    仔细看去,原来是MSXML的版本没有改为自己电脑的MSXML6版本。望诸位留意。


PS:参考了不少网友的大作,一并表示感谢!

http://blog.csdn.net/max2008/article/details/1647613

http://www.newxing.com/Tech/Program/Cpp/703.html

http://www.cnblogs.com/xiaoyusmile/p/3920075.html