这里是利用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文件读写示例”中,我们将深入探讨如何在Java或类似的编程环境中进行XML文件的读取和写入操作。 XML文件的基本结构包括元素(Element)、属性(Attribute)、文本内容(Text Content)、注释(Comment)...
C# XML文件读写操作源码,以及如何调用,注释详解,有任何问题请留言, 以下截取xml文件和部分调用代码段: * ++++++++++++++++++++++++++++++++++++++ <?xml version="1.0" encoding="utf-8" standalone="no"?&...
配置文件,XML文件读写.rar XML的简单易于在多数应用程序中读/写数据,XML是数据交换的公共语言,很多不同的应用软件都支持XML文件。 配置文件,是一种计算机文件,可以对程序配置初始参数;设置程序初始数据。
XML文件读写 C++ 附带测试文件 PC版和PDA两个版本
在这个"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 如何使用...
"XMLREDWP"可能是一个错误或遗漏,没有明确的上下文,但通常情况下,"WP"可能指的是Windows Phone或WordPress等,如果与XML文件读写有关,可能是涉及特定平台或系统的XML处理。 总结起来,XML文件读写是软件开发中...
在QT中处理XML文件,可以方便地进行数据的读取、写入和解析,使得应用程序能够与XML数据进行交互。 首先,我们需要了解QT中的QDomDocument类,它是QT提供的XML解析器,可以用来加载、修改和保存XML文档。使用...
在描述中提到的"XML文件读写XML文件读写",这可能指的是C++程序如何使用这些库进行XML的读写操作。首先,你需要打开XML文件,然后使用库提供的函数解析XML内容。例如,使用TinyXML,你可以使用`TiXmlDocument::Load...
这个“XML文件读写Demo.zip”是一个演示如何在编程环境中操作XML文件的示例,包含创建、保存和读取XML文件的基本步骤。 首先,我们需要了解XML文件的基本结构。XML文件由一系列的元素(Element)组成,每个元素由...
本教程将深入探讨如何使用C#对XML文件进行读写、增删改查操作。 首先,我们来了解C#中的System.Xml命名空间,它是处理XML的基础。该命名空间包含许多类,如XmlDocument、XmlNode、XmlElement等,用于创建、解析和...
本篇文章将深入探讨如何利用 Delphi 和 `TStringList` 进行 XML 文件的读写操作。 一、XML 文件的基本结构 XML 文件由一系列元素组成,每个元素由开始标签和结束标签包围,例如 `<element>` 和 `</element>`。元素...
本项目“java实现Xml文件读写”提供了一个完整的工程实例,包含了对XML文件进行添加、修改和读取的基本操作。 首先,要实现XML文件的读取,Java提供了`javax.xml.parsers`和`org.w3c.dom`这两个核心包。其中,`...
综上所述,"c,c++高手实现xml文件读写解析底层"涉及到的技能点涵盖了XML的基本概念、解析方法、C/C++库选择、读写操作、错误处理和性能优化等多个方面。实际应用中,开发者需要根据项目需求和资源限制选择合适的解析...
"JavaScript FSO实现客户端XML文件读写" 在本文中,我们将探讨如何使用JavaScript的FSO(File System Object)和DOM(Document Object Model)来实现客户端XML文件的读写。XML(Extensible Markup Language)是一种...
本篇文章将深入探讨一个基于Delphi实现的XML文件读写配置类——XMLIniFiles.pas。这个类库的设计目的是为开发者提供一种类似于传统的.INI文件的操作方式,但利用XML的强大功能。 首先,我们来理解一下XML文件的基本...
通过学习和实践EVC中的XML文件读写,开发者可以更好地利用XML在嵌入式系统中存储和传输数据。访问提供的网址(http://www.59186618.com)或许能找到更多相关资源和示例代码,帮助你进一步掌握这一技能。在实际应用中...
XML(eXtensible Markup Language)是...在实际项目中,合理使用XML文件读写能力可以帮助开发者高效地处理数据,实现跨平台的数据交换,提高系统的灵活性和可维护性。通过不断练习和应用,你将逐渐成为XML处理的专家。
XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它以其结构化、自解释性和可扩展性而被...同时,理解XML的语法规则和结构,以及如何使用编程语言提供的XML处理库,是掌握XML文件读写的关键。
本项目"**C++ 读写XML文件**"是针对MFC(Microsoft Foundation Classes)框架的一个示例,展示了如何在C++环境中方便地操作XML文件。 首先,我们需要了解XML的基本结构。XML文件由元素(Element)、属性(Attribute...