因为是做毕业论文,而且vc和xml都是第一次接触,有没有大侠救助下啊如何用MFC来做XML 的读写和保存~
如能提供例子,本人万分感激!THX

解决方案 »

  1.   

    最好用MSXML,
    我也在做这方面的东西,有空交流一下吧。
      

  2.   

    看好了!
    /*author :xujin 
      date   :2004/04/22
      function:create xml
    */
    void CXMLDlg::OnCreateXml() 
    {
    // TODO: Add your control notification handler code here
    ::CoInitialize(NULL);
    MSXML2::IXMLDOMDocumentPtr pDoc;
    MSXML2::IXMLDOMElementPtr xmlRoot;
    //创建DOMDOCUMENT对象
    HRESULT hr=pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument40));
    if(!SUCCEEDED(hr)) 

    {                

    MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 
    return ;


    pDoc->raw_createElement((_bstr_t)(char*)"china", &xmlRoot);
    pDoc->raw_appendChild(xmlRoot, NULL);
    MSXML2::IXMLDOMElementPtr  childNode ;         
    pDoc->raw_createElement((_bstr_t)(char*)"City", &childNode);
    childNode->Puttext("WuHan");//节点值

    childNode->setAttribute("population","8,000,000");//属性名,属性值

    childNode->setAttribute("area","10000");

    xmlRoot->appendChild(childNode);

    pDoc->raw_createElement((_bstr_t)(char*)"City", &childNode);

    childNode->Puttext("ShangHai");

    childNode->setAttribute("population","12,000,000");

    childNode->setAttribute("area","12000");

    xmlRoot->appendChild(childNode);

    pDoc->save("e:\\he.xml"); 

    }
    /*author:xujin
       date:2004/04/22
       modifydate:2004/04/22
       function:Pharse xml
    */void CXMLDlg::OnPharseXml() 
    {
    // TODO: Add your control notification handler code here
    MSXML2::IXMLDOMDocumentPtr pDoc; 

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

    if(!SUCCEEDED(hr)) 

    {                

    MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 
    return ;



    //加载文件

    pDoc->load("e:\\he.xml");

      MSXML2::IXMLDOMElementPtr  childNode ;
      
      childNode = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode("//City"));
      
      
      
      //得到节点类型
      
      MSXML2::DOMNodeType nodeType;
      
      childNode->get_nodeType(&nodeType);
      
      BSTR var;
      
      CString name;
      
      childNode->get_nodeName(&var);
      
      name = (char*)(_bstr_t)var;
      
      
      
      //节点值
      
      
      
      
      VARIANT varVal;
      
      childNode->get_nodeTypedValue(&varVal);
      
      CString strValue = (char*)(_bstr_t)varVal;
      
      
      
      //节点属性,放在链表中
      
      
      MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL; 
      
      MSXML2::IXMLDOMNodePtr pAttrItem;
      
      childNode->get_attributes(&pAttrs);
      
      long nCount ;
      
      pAttrs->get_length(&nCount);
      
      for(int i = 0 ; i < nCount ; i++)
      
      {                 
      
      pAttrs->get_item(i,&pAttrItem);
      
      //我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
      
      //也可以直接得到
      
      CString strAttrName   = (char*)(_bstr_t)pAttrItem->nodeName;
      
      CString strAttrValue  = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
      
      }
      
      
      
      
      
    }
      

  3.   

    给我留言,留下你的email,我给你发个我写好的类,没有内存泄漏。
    另外,写xml文件使用dom的方式,而如果你读取xml文件,尽量使用sax方式,这是我的经验,后者占用内存很少,执行效率高。
      

  4.   

    谢谢,我给你留言了~jinxuliang(smielfox)
    我问个很“农民”的问题~
    你那段代码是加在MFC AppWizard的source files的哪个文件里?
    还有,要不要在stdafx.h中加#import"msxml4.dll"?
    8要比4我啊,刚接触这些,还跟小学生一样~:-)
      

  5.   


    IXMLDOMDocumentPtr   pXMLDoc;  //配置文件
    MSXML2::IMXWriterPtr         pWr;void CIMClientDlg::CreateXMLdoc(CFile *pfile)
    {

    HRESULT hr; 
        hr = CoInitialize(NULL); 
    USES_CONVERSION;
    //ISAXDTDHandlerPtr dtd=NULL;
    hr = pWr.CreateInstance(__uuidof(MSXML2::MXXMLWriter));
    //dtd = pWr; 
    pWr->indent = VARIANT_TRUE;
    pWr->omitXMLDeclaration =VARIANT_TRUE; 

        ISAXContentHandlerPtr spContentHandler=NULL;
        spContentHandler = pWr; 
    hr = spContentHandler->startDocument ();
    char szPI[]= "version='1.0' encoding='gb2312' standalone='no'";//iso-8859-1   encoding = 'utf-16'

    //Step 1: Create the XML declaration. 
    hr = spContentHandler->processingInstruction(L"xml", 3, A2W(szPI), strlen(szPI));//xml版本声明
    IMXAttributesPtr     pMXAttr = NULL;
    ISAXAttributesPtr    spAttributes = NULL;
    hr = pMXAttr.CreateInstance(__uuidof(MSXML2::SAXAttributes));
    hr = spContentHandler->startElement(L"", 0, L"userlist",8, L"userlist",8,spAttributes);   

        spContentHandler = pWr ;
    int nIndex = 0;
        int step =0;
    hr = pMXAttr->clear();  
    //其他组
        pMXAttr->addAttribute(L"",L"GroupName",L"GroupName","string","其他");
        spAttributes = pMXAttr;
        hr = spContentHandler->startElement(L"", 0, L"G",1, L"G",1,spAttributes);
    hr = pMXAttr->clear();  
    hr = spContentHandler->endElement(L"",0,L"G",1, L"G",1);
        
    hr = spContentHandler->endElement(L"",0,L"userlist",8, L"userlist",8); 
    hr = spContentHandler->endDocument(); 

    VARIANT vtTemp = pWr->output;
    CString str ="";
    str= vtTemp.bstrVal; 
        LPTSTR st = str.LockBuffer();
        int len = str.GetLength();
    pfile->Write(st,len);
    vtTemp.vt =VT_EMPTY;
    pWr->output = vtTemp;

        HTREEITEM  hItem = tree_ctrl.AddGroup("其他"); 
    if(hItem)
    {
    tree_ctrl.SetItemColor(hItem,RGB(19,55,144)); 
    tree_ctrl.SetItemImage(hItem,0,0);
    }
    /* spContentHandler->Release ();
    pMXAttr->Release ();
    spAttributes->Release ();*/
    }
      

  6.   

    网上的资料多多,
    www.vckbase.com里就有源码,你可以去找找,如果还有什么问题,可以联系
      

  7.   

    读写都有现成的接口msxml,多看看msdn吧