vc6如何读写xml

来源:互联网 发布:matlab画矩阵灰度图 编辑:程序博客网 时间:2024/05/11 13:53
在cpp中增加
#import "msxml.dll" rename_namespace("MSXML")


-----这几名一定要加否则报错,表示以COM形式调用所以要初始化一下COM----------
    AfxEnableControlContainer();
    ::AfxOleInit();
    ::CoInitialize(NULL);
因为是com操作,所以一开始有个引入

#include "msxml.h"
#import "C:/windows/system32/msxml.dll" rename_namespace("xml")

以及声明com

 AfxEnableControlContainer();
    ::AfxOleInit();

    ::CoInitialize(NULL);
--------------------------------------------


//初始MSXML智能指针
    MSXML::IXMLDOMDocumentPtr doc=NULL;
    MSXML::IXMLDOMElementPtr ele=NULL;
    MSXML::IXMLDOMNodePtr Node=NULL, NodeTable=NULL, NodeField=NULL;
    hr=doc.CreateInstance(_T("MSXML.domdocument"));
    if(FAILED(hr)) {
        //Error(_T("MSXML not installed!"));
        SetState(dmstNormal);
        return FALSE;
    }

    //load from file or buf
    if(bFromFile) {
        if(doc->load(filename)==VARIANT_FALSE) {
            doc=NULL;
            s.Format(_T("XML File %s not found"), (_bstr_t)filename);
            Error(s);
            SetState(dmstNormal);
            return FALSE;
        }
    }
    else doc->loadXML(xml);

    //根元素
    ele=doc->documentElement;
    if(ele==NULL)
    {
        SetState(dmstNormal);
        return TRUE;
    }


    //逐个表元素
    for(NodeTable=ele->firstChild; NodeTable!=NULL; NodeTable=NodeTable->nextSibling) {
        TableName=(LPCTSTR)NodeTable->nodeName;
        //if(CPub::ArrayCompareNoCase(arrTable, TableName)==-1) continue;
        row=InsertRow(bAsNew);
        //逐个字段
        for(NodeField=NodeTable->firstChild; NodeField!=NULL; NodeField=NodeField->nextSibling) {
            FieldName=(LPCTSTR)NodeField->nodeName;
            if(FieldName.Find(_T("."))==-1 && TableName.IsEmpty()==FALSE)
                FieldName=/*TableName +_T(".")+*/ FieldName;
            col=GetFieldIndex(FieldName);
            if(col==-1) continue;

            //Data
            //datatype=GetColDataType(col);
            Data=(LPCTSTR)NodeField->text;
            /*if(datatype==DATATYPE_DATETIME) {
                Data.Replace(_T('T'), _T(' '));
                if(Data.GetLength()>19) Data=Data.Left(19);
            }
            CDataTableStatic::SetData(row, col, Data);*/
            if(GetFieldType(col) == ftDateTime)
            {
                tempDT.ParseDateTime(Data);
                if ((tempDT.GetStatus() == COleDateTime::invalid)&&Data.GetLength() > 0)
                {
                    tempDT = CPub::CString2COleDateTime(Data);
                    
                    //tempDT = dt1;
                    Data = tempDT.Format();
                }
            }
            this->SetAsString(col,row,Data);
        }
    }
    doc=NULL;
    ele=NULL;
    Node=NULL;
    NodeTable=NULL;
    NodeField=NULL;

    SetState(dmstNormal);
    return TRUE;