当前位置:C++技术网 > 资讯 > 基于msxml库实现的xml文件一组操作函数代码分享

基于msxml库实现的xml文件一组操作函数代码分享

更新时间:2016-12-14 10:44:14浏览次数:1+次

    我用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;
}
    如果使用中有什么问题,文后留言即可。