`
CrackRen
  • 浏览: 170366 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

XML文件读写

    博客分类:
  • VC++
XML 
阅读更多

这里是利用COM组建对xml文件进行操作,所以程序进入时要进行COM组件的初始化和卸载

::CoInitialize(NULL); 和 ::CoUninitialize();要对应

为了不影响其他地方的操作,最好把这个放在项目的开始和结束

你也可以使用AfxOleInit();他对CoInitialize进行了封装,具体的区别可以到网上查一下

另外确保安装了MS XML Parser 运行库

 

 

使用时需要加上

#import <msxml3.dll>
 

下面的两个函数就是对xml文件的操作,大部分操作都已涉及

 

///////////////////////////////////////////////////////////////////////////////
#import <msxml3.dll>
typedef MSXML2::IXMLDOMDocumentPtr DOMDocumentPtr;
typedef MSXML2::IXMLDOMElementPtr DOMElementPtr;
typedef MSXML2::IXMLDOMProcessingInstructionPtr	DOMProInstructionPtr;
typedef MSXML2::IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;
typedef MSXML2::IXMLDOMNodeListPtr DOMNodeListPtr;
typedef MSXML2::IXMLDOMNodePtr DOMNodePtr;
typedef MSXML2::IXMLDOMTextPtr DOMTextPtr;
///////////////////////////////////////////////////////////////////////////////
int ReadXML(CString szXMLFile)
{
	if (szXMLFile.IsEmpty())
		return -1;

	DOMDocumentPtr pXMLDoc;
	CString szText;

	// 初始化COM组件,必须与::CoUninitialize();相对应
	// 这里可以这么使用,但以后尽量在程序开始调用,程序结束卸载,否则可能会影响到其他地方使用
	// 用AfxOleInit();也可以,但也必须确保只调用了一次,最好放在程序的开始
	::CoInitialize(NULL);
	
	// 创建DOMDocument对象,并判断是否创建成功
	HRESULT	hr = pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
	if(!SUCCEEDED(hr))
	{
		MessageBox(NULL, "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!", "Error", MB_ICONERROR|MB_OK);
		return -1;
	}

	if(pXMLDoc->load(_variant_t(szXMLFile)) == FALSE)
	{
		MessageBox(NULL, "无法打开存档!", "Error", MB_ICONERROR|MB_OK);
		return -2;
	}

	// 是否有根节点,取得根节点
	DOMElementPtr pRootElem = pXMLDoc->GetdocumentElement();
	if (pRootElem == NULL)
		return -3;

	// 取得根节点的名字
	szText = (char*)(pRootElem->GetnodeName());

	// 在根节点下查找名叫Globals的节点并取得
	DOMNodePtr pGlobalNode = pRootElem->selectSingleNode("Globals");
	if (pGlobalNode == NULL)
		return -3;
	
	// 取得属性列表
	DOMNamedNodeMapPtr pNodeMap = pGlobalNode->Getattributes();

	// 根据名字直接取得属性节点并获取值
	DOMNodePtr pAttribNode = pNodeMap->getNamedItem("Attrib");
	szText = (char *)(pAttribNode->Gettext());
	pAttribNode = pNodeMap->getNamedItem("作用");
	szText = (char *)(pAttribNode->Gettext());

	// 另外在有些情况下Node可以转换成Element使用
	DOMElementPtr pGlobalElem = pGlobalNode;
	szText = (char*)(_bstr_t)(pGlobalElem->getAttribute("Attrib"));
	szText = (char*)(_bstr_t)(pGlobalElem->getAttribute("作用"));
	
	// 如果不知道名字可以取得属性的个数,逐个查找属性
	long len = pNodeMap->Getlength();
	for (int i=0; i<len; ++i)
	{
		pAttribNode = pNodeMap->Getitem(i);
		szText = (char *)(pAttribNode->GetnodeName());	// 取得属性名字
		szText = (char *)(pAttribNode->Gettext());		// 取得属性值
	}
	
	DOMNodePtr pTempNode;
	// 取得Globals下的子节点
	if((pTempNode = pGlobalNode->GetfirstChild()))
	{
		szText = (char*)pTempNode->GetnodeName();
		szText = (char*)pTempNode->Gettext();

		// 循环取得相邻的节点
		while((pTempNode = pTempNode->GetnextSibling()))
		{
			szText = (char*)pTempNode->GetnodeName();
			szText = (char*)pTempNode->Gettext();
		}
	}

	// 从根节点中查找Data的子节点
	DOMNodePtr pDataNode = pRootElem->selectSingleNode("Data");
	if (pDataNode == NULL)
		return -1;

	// 从Data节点下列取出所有叫Data的节点
	DOMNodeListPtr pDataList = pDataNode->selectNodes("Data");
	len = pDataList->Getlength();
	for(i=0; i<len; ++i)
	{
		pTempNode = pDataList->Getitem(i);
		szText = (char*)pTempNode->GetnodeName();
		szText = (char*)pTempNode->Gettext();
	}

	// 确保卸载掉所有的对象才能调用CoUninitialize
	if(pNodeMap)pNodeMap.Detach();
	if(pAttribNode)pAttribNode.Detach();
	if(pTempNode)pTempNode.Detach();
	if(pGlobalNode)pGlobalNode.Detach();
	if(pGlobalElem)pGlobalElem.Detach();
	if(pDataNode)pDataNode.Detach();
	if(pDataList)pDataList.Detach();
	if(pRootElem)pRootElem.Detach();
	if(pXMLDoc)pXMLDoc.Detach();

	// 卸掉COM,必须与CoInitialize对应
	::CoUninitialize();
	return 0;
}

int SaveXML(CString szXMLFile)
{
	DOMDocumentPtr pXMLDoc;
	CString szText;

	// 初始化COM组件,必须与::CoUninitialize();相对应
	// 这里可以这么使用,但以后尽量在程序开始调用,程序结束卸载,否则可能会影响到其他地方使用
	// 用AfxOleInit();也可以,但也必须确保只调用了一次,最好放在程序的开始
	::CoInitialize(NULL);

	// 创建DOMDocument对象,并判断是否创建成功
	HRESULT	hr = pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
	if(!SUCCEEDED(hr))
	{
		MessageBox(NULL, "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!", "Error", MB_ICONERROR|MB_OK);
		return -1;
	}

	// 创建头节点
	DOMProInstructionPtr pXmlProNode = pXMLDoc->createProcessingInstruction(_bstr_t("xml"),_bstr_t("version=\"1.0\" encoding = \"GB2312\""));
	pXMLDoc->appendChild((MSXML2::IXMLDOMNodePtr)pXmlProNode);	
	pXmlProNode.Detach();	//以后不再用的,卸掉

	// 创建并添加根节点
	// 创建一个节点
	DOMElementPtr pXmlRoot = pXMLDoc->createElement("root");
	// 添加到文档中
	pXMLDoc->appendChild(pXmlRoot);

	// 创建一个节点
	DOMElementPtr pGlobalNode = pXMLDoc->createElement("Globals");
	// 添加到根节点中
	pXmlRoot->appendChild(pGlobalNode);

	// 添加两个属性
	pGlobalNode->setAttribute("Attrib", "Value");
	pGlobalNode->setAttribute("作用", "记录全局数据");

	DOMElementPtr pTempNode = pXMLDoc->createElement("Author");
	pTempNode->Puttext("Ren.Xia");// 添加内容
	pGlobalNode->appendChild(pTempNode);
	pTempNode.Detach();

	pTempNode = pXMLDoc->createElement("Date");
	pTempNode->Puttext("2011-02-12");// 添加内容
	pGlobalNode->appendChild(pTempNode);
	pTempNode.Detach();
	pGlobalNode.Detach();

	// 在Root下创建Data子节点
	DOMElementPtr pDataNode = pXMLDoc->createElement("Data");
	pDataNode->setAttribute("Attrib", "Value");
	pDataNode->setAttribute("作用", "记录数据");
	pXmlRoot->appendChild(pDataNode);

	for (int i=0; i<100; ++i)
	{
		pTempNode = pXMLDoc->createElement("Data");
		szText.Format("%d", i);
		pTempNode->Puttext((_bstr_t)szText);
		pDataNode->appendChild(pTempNode);
		pTempNode.Detach();
	}
	pDataNode.Detach();

	// 判断名字是否为空
	if (szXMLFile.IsEmpty())
	{
		pXmlRoot.Detach();
		pXMLDoc.Detach();
		return -2;
	}

	// 存储并判断是否成功
	hr = pXMLDoc->save((LPCTSTR)szXMLFile);
	pXmlRoot.Detach();
	pXMLDoc.Detach();
	if(!SUCCEEDED(hr))
	{
		MessageBox(NULL, "无法保存!", "Error", MB_ICONERROR|MB_OK);
		return -3;
	}	
	MessageBox(NULL, "保存完毕!", "Error", MB_ICONASTERISK|MB_OK);
	
	// 卸掉COM,必须与CoInitialize对应
	::CoUninitialize();
	return 0;
}


 

另外如果知道一个节点的名字"Data",但是不知道在哪一层,那个树下

可以在查找时名字前加个"//"这样就表示在任意一层查找  

 

pRootElem->selectSingleNode(" //Data");
 

 

  • XML.rar (484.4 KB)
  • 下载次数: 5
分享到:
评论

相关推荐

    Xml文件读写示例

    在这个“Xml文件读写示例”中,我们将深入探讨如何在Java或类似的编程环境中进行XML文件的读取和写入操作。 XML文件的基本结构包括元素(Element)、属性(Attribute)、文本内容(Text Content)、注释(Comment)...

    C# XML文件读写操作-源码

    C# XML文件读写操作源码,以及如何调用,注释详解,有任何问题请留言, 以下截取xml文件和部分调用代码段: * ++++++++++++++++++++++++++++++++++++++ &lt;?xml version="1.0" encoding="utf-8" standalone="no"?&...

    Labview 配置文件,XML文件读写.rar

    配置文件,XML文件读写.rar XML的简单易于在多数应用程序中读/写数据,XML是数据交换的公共语言,很多不同的应用软件都支持XML文件。 配置文件,是一种计算机文件,可以对程序配置初始参数;设置程序初始数据。

    XML文件读写 C++

    XML文件读写 C++ 附带测试文件 PC版和PDA两个版本

    xml文件读写demo

    在这个"xml文件读写demo"项目中,我们将探讨如何在C#环境下操作XML文件,包括读取和写入XML数据。 首先,我们关注的是"OpXmlDemo.sln"文件,这是一个Visual Studio解决方案文件。它包含了项目的所有配置信息,包括...

    Visual C++源代码 56 如何使用XML文件读写图像

    Visual C++源代码 56 如何使用XML文件读写图像Visual C++源代码 56 如何使用XML文件读写图像Visual C++源代码 56 如何使用XML文件读写图像Visual C++源代码 56 如何使用XML文件读写图像Visual C++源代码 56 如何使用...

    xml 文件读写,有实例

    "XMLREDWP"可能是一个错误或遗漏,没有明确的上下文,但通常情况下,"WP"可能指的是Windows Phone或WordPress等,如果与XML文件读写有关,可能是涉及特定平台或系统的XML处理。 总结起来,XML文件读写是软件开发中...

    基于QT实现XML文件读写操作,解析操作

    在QT中处理XML文件,可以方便地进行数据的读取、写入和解析,使得应用程序能够与XML数据进行交互。 首先,我们需要了解QT中的QDomDocument类,它是QT提供的XML解析器,可以用来加载、修改和保存XML文档。使用...

    XML.rar_C++读写xml_c xml_xml_xml文件读写_xml读写

    在描述中提到的"XML文件读写XML文件读写",这可能指的是C++程序如何使用这些库进行XML的读写操作。首先,你需要打开XML文件,然后使用库提供的函数解析XML内容。例如,使用TinyXML,你可以使用`TiXmlDocument::Load...

    XML文件读写Demo.zip

    这个“XML文件读写Demo.zip”是一个演示如何在编程环境中操作XML文件的示例,包含创建、保存和读取XML文件的基本步骤。 首先,我们需要了解XML文件的基本结构。XML文件由一系列的元素(Element)组成,每个元素由...

    C#对xml文件读写

    本教程将深入探讨如何使用C#对XML文件进行读写、增删改查操作。 首先,我们来了解C#中的System.Xml命名空间,它是处理XML的基础。该命名空间包含许多类,如XmlDocument、XmlNode、XmlElement等,用于创建、解析和...

    xml文件读写

    本篇文章将深入探讨如何利用 Delphi 和 `TStringList` 进行 XML 文件的读写操作。 一、XML 文件的基本结构 XML 文件由一系列元素组成,每个元素由开始标签和结束标签包围,例如 `&lt;element&gt;` 和 `&lt;/element&gt;`。元素...

    java实现Xml文件读写

    本项目“java实现Xml文件读写”提供了一个完整的工程实例,包含了对XML文件进行添加、修改和读取的基本操作。 首先,要实现XML文件的读取,Java提供了`javax.xml.parsers`和`org.w3c.dom`这两个核心包。其中,`...

    c,c++高手实现xml文件读写解析底层

    综上所述,"c,c++高手实现xml文件读写解析底层"涉及到的技能点涵盖了XML的基本概念、解析方法、C/C++库选择、读写操作、错误处理和性能优化等多个方面。实际应用中,开发者需要根据项目需求和资源限制选择合适的解析...

    JavaScript FSO实现客户端XML文件读写.pdf

    "JavaScript FSO实现客户端XML文件读写" 在本文中,我们将探讨如何使用JavaScript的FSO(File System Object)和DOM(Document Object Model)来实现客户端XML文件的读写。XML(Extensible Markup Language)是一种...

    自己写的delphi下xml文件读写配置类

    本篇文章将深入探讨一个基于Delphi实现的XML文件读写配置类——XMLIniFiles.pas。这个类库的设计目的是为开发者提供一种类似于传统的.INI文件的操作方式,但利用XML的强大功能。 首先,我们来理解一下XML文件的基本...

    evc写的XML文件读写程序

    通过学习和实践EVC中的XML文件读写,开发者可以更好地利用XML在嵌入式系统中存储和传输数据。访问提供的网址(http://www.59186618.com)或许能找到更多相关资源和示例代码,帮助你进一步掌握这一技能。在实际应用中...

    XML文件读写示例完整版

    XML(eXtensible Markup Language)是...在实际项目中,合理使用XML文件读写能力可以帮助开发者高效地处理数据,实现跨平台的数据交换,提高系统的灵活性和可维护性。通过不断练习和应用,你将逐渐成为XML处理的专家。

    XML文件的读写.rar

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它以其结构化、自解释性和可扩展性而被...同时,理解XML的语法规则和结构,以及如何使用编程语言提供的XML处理库,是掌握XML文件读写的关键。

    C++ 读写XML文件

    本项目"**C++ 读写XML文件**"是针对MFC(Microsoft Foundation Classes)框架的一个示例,展示了如何在C++环境中方便地操作XML文件。 首先,我们需要了解XML的基本结构。XML文件由元素(Element)、属性(Attribute...

Global site tag (gtag.js) - Google Analytics