收到JAVA程序发过来的一串XML,
VC++中有什么可以解析xml的?非常感谢!!!!

解决方案 »

  1.   

    msxml
    微软的开发包,支持dom和sax
      

  2.   

    //AaaaDlg.h
    #import <msxml.dll> named_guids
    using namespace MSXML;class CAaaaDlg : public CDialog
    {
    ......
    protected:
    CTreeCtrl m_TreeCtrl;
    MSXML::IXMLDOMDocumentPtr m_plDomDocument;
    MSXML::IXMLDOMElementPtr m_pDocRoot;
    ......
    };//AaaaDlg.cpp
    BOOL CAaaaDlg::OnInitDialog()
    {
    ......
    // TODO: 在此添加额外的初始化代码
    //Initialize COM
    ::CoInitialize(NULL); HRESULT hr =
    m_plDomDocument.CreateInstance(MSXML::CLSID_DOMDocument);
    if( FAILED(hr))
    {
    _com_error er(hr);
    AfxMessageBox(er.ErrorMessage());
    EndDialog(1);
    }
    return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
    }void CAaaaDlg::OnBnClickedOk()
    {
    CFileDialog fileDlg(TRUE);
    if(IDOK == fileDlg.DoModal())
    {
    m_TreeCtrl.DeleteAllItems(); CString strFileName=(fileDlg.GetPathName()); //Convert XML file name string to somethinf
    //COM can handle(bstr)
    _bstr_t bstrFileName;
    bstrFileName = strFileName.AllocSysString(); //Call the IXMLDOMDocumentPtr's load function
    //to load the XML document.
    variant_t vResult;
    vResult = m_plDomDocument->load(bstrFileName); if(( (bool)vResult ) == TRUE)//success!
    {
    m_pDocRoot = m_plDomDocument->documentElement;
    DisplayChildren(TVI_ROOT, m_pDocRoot);
    if(0 == m_TreeCtrl.GetCount())
    {
    m_TreeCtrl.InsertItem("Empty document");
    }
    }
    else
    {
    m_TreeCtrl.InsertItem("Document FAILED to load!");
    }
    }
    }void CAaaaDlg::DisplayChildren(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pParent)
    {
    //Display the current node's name
    HTREEITEM hItem = DisplayChild(hParent, pParent); //Simple for loop to get all children
    for(MSXML::IXMLDOMNodePtr pChild = pParent->firstChild;
    NULL != pChild; pChild = pChild->nextSibling)
    {
    //For each child, call this function so that you get
    //its children as well.
    hItem = DisplayChild(hItem, pChild);
    DisplayChildren(hItem, pChild);
    }
    }HTREEITEM CAaaaDlg::DisplayChild(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pChild)
    {
    //Add the element's node name to the tree view
    //and return the hItem.
    CString strElement( (LPCTSTR)pChild->nodeName);
    return m_TreeCtrl.InsertItem(strElement, hParent);
    }
      

  3.   

    XML文档对象模型(DOM)是一种功能强大、健壮的程序化接口,
    使用该接口不仅能够通过程序上载和分析XML文件或文档,而
    且还可以用来遍历XML数据....可以找相关的书查一下:)
      

  4.   

    上面的例程就是一个遍历XML数据,并在CTreeCtrl树视图
    控件中分层展开的例子..
      

  5.   

    实例代码:
    link 里面添加:msxml2.lib#include "msxml2.h"try
    {
    HRESULT hr;
    IXMLDOMDocument* pXMLDoc;
    IXMLDOMNode* pXDN;

    //COM的初始化 
    hr=CoInitialize(NULL);
        
    //得到关于IXMLDOMDocument接口的指针pXMLDOC
    hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,
     IID_IXMLDOMDocument,(void**) &pXMLDoc); 
        
    //将XML字符串转换成UNICODE,然后加载
    VARIANT_BOOL bSuccess = false;
    pXMLDoc->loadXML(L"<?xml version=\"1.0\" encoding=\"GB2312\"?><root><file><time>2003-10-13</time><content>内容</content><title>标题</title></file></root>",&bSuccess);

    //得到已加载的XML字符串,并显示
    LPWCH tempxml;

    //因为此处是输出参数[out][retval],所以不用new一段空间
    pXMLDoc->get_xml(&tempxml);
    MessageBoxW(NULL,tempxml,L"XML正文",MB_OK);

    //取到<time>,<title>以及<content>节点,并显示结点内容
    pXMLDoc->selectSingleNode(L"//time",(IXMLDOMNode **)&pXDN);
    pXDN->get_text(&tempxml);
    MessageBoxW(NULL,tempxml,L"time值",MB_OK);
    pXMLDoc->selectSingleNode(L"//title",(IXMLDOMNode **)&pXDN);
    pXDN->get_text(&tempxml);
    MessageBoxW(NULL,tempxml,L"title值",MB_OK);
    pXMLDoc->selectSingleNode(L"//content",(IXMLDOMNode **)&pXDN);
    pXDN->get_text(&tempxml);
    MessageBoxW(NULL,tempxml,L"content值",MB_OK); //释放分配的资源

    CoUninitialize();
    }
    catch(...)
    {
    AfxMessageBox("错误!");
    }
      

  6.   

    msxml的接口很简单,特别是dom,不过你要了解一点com的调用方法
      

  7.   

    楼主,您好!我看你的帖子中有这样一句话“收到JAVA程序发过来的一串XML”我现在已经能解析xml文件,但是不知道怎样用java程序发过来这样的一串xml,急用,盼回,等待中......
      

  8.   

    太多XML开发包都支持window.和vc没关系