我用msxml库来操作xml文件,实现了一组方便的函数。一直用着挺好,就分享给大家使用。这是我的实际项目中的代码,函数封装良好,使用简单。
这一组函数应用的场景就是:节点名全局(整个xml文件)唯一,如果不唯一,则只能操作第一个节点。用在简单的xml配置文件里。节点没有属性,只有文本值。
这个对于应用程序配置文件就足够了,简单易用。
xml配置文件的格式示例:
<?xml version="1.0" encoding="utf-8"?>
<setting>
<server>
<ip>127.0.0.1</ip>
<port>7000</port>
</server>
<database>
<ds></ds>
<db></db>
<uid></uid>
<pwd></pwd>
</database>
</setting>
函数支持指定节点名称获取字符串、int、double类型。设置节点值就统一用一个函数,额外增加了设置int的函数。当然,源码面前毫无秘密,你可以自己增加自己需要的版本,仿照着这些函数写就行了。
函数声明:
bool SetValue(string strName,string strValue,string strPath);
bool SetValue(string strName,int Value,string strPath);
string GetValueStr(string strName,string strPath);
int GetValueInt(string strName,string strPath);
double GetValueDouble(string strName,string strPath);
说明:strName为节点名称,strPath为xml文件名全路径,Value则是int值,strValue为字符串值。函数使用很简单。
函数定义:
bool SetValue(string strName,string strValue,string strPath)
{
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;// - XML文档对象
HRESULT HR = XMLDOC.CreateInstance(__uuidof(MSXML2::DOMDocument30));// - 创建XML文档实例
XMLDOC->load(strPath.c_str());// - 加载xml文件
strName = "//"+strName;
MSXML2::IXMLDOMNodePtr pNode = XMLDOC->selectSingleNode(strName.c_str());
_variant_t value;
HRESULT hr = pNode->put_text(_bstr_t(strValue.c_str()));
pNode.Release();
XMLDOC->save(strPath.c_str());
XMLDOC.Release(); // - 释放使用的文档对象
::CoUninitialize(); // - 释放COM组件使用环境
if(SUCCEEDED(hr))
return true;
else
return false;
}
bool SetValue(string strName,int Value,string strPath)
{
ostringstream ostr;
ostr <<Value;
string str = ostr.str();
return SetValue(strName,str,strPath);
}
string GetValueStr(string strName,string strPath)
{
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;// - XML文档对象
HRESULT HR = XMLDOC.CreateInstance(__uuidof(MSXML2::DOMDocument30));// - 创建XML文档实例
XMLDOC->load(strPath.c_str());// - 加载xml文件
strName = "//"+strName;
MSXML2::IXMLDOMNodePtr pNode = XMLDOC->selectSingleNode(strName.c_str());
_variant_t value;
pNode->get_nodeTypedValue(&value);
std::string strValue = _bstr_t(value);
pNode.Release();
XMLDOC.Release(); // - 释放使用的文档对象
::CoUninitialize(); // - 释放COM组件使用环境
return strValue;
}
int GetValueInt(string strName,string strPath)
{
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;// - XML文档对象
HRESULT HR = XMLDOC.CreateInstance(__uuidof(MSXML2::DOMDocument30));// - 创建XML文档实例
XMLDOC->load(strPath.c_str());// - 加载xml文件
strName = "//"+strName;
MSXML2::IXMLDOMNodePtr pNode = XMLDOC->selectSingleNode(strName.c_str());
_variant_t value=0;
pNode->get_nodeTypedValue(&value);
int Value = (int)value;
pNode.Release();
XMLDOC.Release(); // - 释放使用的文档对象
::CoUninitialize(); // - 释放COM组件使用环境
return Value;
}
double GetValueDouble(string strName,string strPath)
{
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;// - XML文档对象
HRESULT HR = XMLDOC.CreateInstance(__uuidof(MSXML2::DOMDocument30));// - 创建XML文档实例
XMLDOC->load(strPath.c_str());// - 加载xml文件
strName = "//"+strName;
MSXML2::IXMLDOMNodePtr pNode = XMLDOC->selectSingleNode(strName.c_str());
_variant_t value;
pNode->get_nodeTypedValue(&value);
double Value = (double)value;
pNode.Release();
XMLDOC.Release(); // - 释放使用的文档对象
::CoUninitialize(); // - 释放COM组件使用环境
return Value;
}
代码使用前,需要包含头文件和引用dll:
#include <string>
using namespace std;
#include <Winsock2.h>
#import "msxml3.dll" // - 直接在文件中导入,不依赖IDE的导入,移植性好
开发环境,我是在Windows7的VS2010中使用的。如果缺少其他头文件,请自行补充完整,因为是从项目中提取出来的,没有写测试代码,可能会漏头文件。
测试使用代码:
//头文件包含好
void main()
{
string ip = GetValueStr(“ip”,"set.xml");
cout<<ip<<endl;
}
如果使用中有什么问题,文后留言即可。