现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

VC–操作xml(利用微软自带的xml库)

2012-07-08 21:29 工业·编程 ⁄ 共 2277字 ⁄ 字号 暂无评论

将msxml4.tlh和msxml4.tli这2个文件拷贝到debug文件夹下:下载路径(http://download.csdn.net/source/3372618

在stdafx.h中添加如下代码:

#import <msxml4.dll>
#define XMLDocPtr  MSXML2::IXMLDOMDocumentPtr
#define XMLNodePtr  MSXML2::IXMLDOMNodePtr
#define XMLNodeListPtr  MSXML2::IXMLDOMNodeListPtr

这样你就可以使用xml库了。

首先导入文件:

//创建XML实例
        HRESULT hr;

        XMLDocPtr pDoc;

        hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));

        if (FAILED(hr))
        {
            AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
            break;
        }

        pDoc->load((LPCTSTR)pinfo->strSydb);

现在你可以拿着这个pDoc获得你想要的内容了。

同事封装了2个很好用的函数,在这里和大家分享一下:

//////////////////////////////////////////////////////////////////////////
//获取XML节点的值,函数类型为void,用于获取CString的值
void GetXMLNodeValue(XMLNodePtr pNode, LPCTSTR strDesc, CString& strValue)
{
    if (pNode == NULL)
    {
        strValue = "";
        return;
    }

    //
    XMLNodePtr pNodeValue = pNode;

    _variant_t v;

    if (strDesc != "")
        pNodeValue = pNode->selectSingleNode(strDesc);

    if (pNodeValue == NULL)
    {
        strValue = "";
        return;
    }

    v = pNodeValue->GetnodeTypedValue();

    strValue = CString(v.bstrVal);
    SysFreeString(v.bstrVal);
    v.Clear();
}

//////////////////////////////////////////////////////////////////////////
//获取XML节点的值,函数类型为int,用于获取int的值
int GetXMLNodeValue(XMLNodePtr pNode, LPCTSTR strDesc)
{
    if (pNode == NULL)
        return 0;

    //
    _variant_t v;

    XMLNodePtr pNodeValue = pNode;

    CString strValue;

    if (strDesc != "")
        pNodeValue = pNode->selectSingleNode(strDesc);

    if (pNodeValue == NULL)
        return 0;

    v = pNodeValue->GetnodeTypedValue();

    strValue = CString(v.bstrVal);

    SysFreeString(v.bstrVal);

    v.Clear();

    return atoi(strValue);
}

使用方法如下:

如下:

某一个xml的格式如下:

   <sport ID="1" Name=“basketball”>
      <grade>87</grade>
    </sport>

1.某个查询条件下有多个满足条件的键值存在selectNodes函数

CString strFind;

CString str = "sport";

strFind.Format("%s[@ID='%d']", str , nid);
    XMLNodeListPtr pList = pDoc->selectNodes((LPCTSTR)strFind);

    for (int i = 0; i < pList->Getlength();++i)
    {
        XMLNodePtr pNode = pList->Getitem(i);

CString sportName = "";

GetXMLNodeValue(pNode, "@Name", sportName );

     }

2.某个查询条件下只有1个满足条件的键值存在selectSingleNode函数

CString strFind;

CString str = "sport";

strFind.Format("%s[@ID='%d']", str , nid);
    XMLNodePtr pNode = pDoc->selectSingleNode((LPCTSTR)strFind);

    if (pNode)
    {

int grade = GetXMLNodeValue(pNode, "grade");

}

注意@符号的使用。

好了,就这么简单!

给我留言

留言无头像?