我自己记录的 VC 操作 XML 笔记

1.    在文件头中添加如下:
        #import <msxml4.dll>
        using namespace MSXML2;
2.    程序体如下:
        void RanderNodeList(MSXML2::IXMLDOMNodeListPtr nodeList ,_bstr_t * retString)
        {
            CoInitialize(NULL);

            MSXML2::IXMLDOMNamedNodeMapPtr pMap;
            pMap.CreateInstance(__uuidof(MSXML2::IXMLDOMNamedNodeMap));

            for(int i=0 ;i < nodeList->length ;i++)
            {
                //处理节点名.
                if ( nodeList->item[i]->nodeName  == (_bstr_t)"xml" )
                {
                    (*retString) += "<?";
                }
                else
                {
                    (*retString) += "<";
                }
                (*retString )+= nodeList->item[i]->nodeName ;
                (*retString) += " ";

                //处理节点属性.
                pMap = nodeList->item[i]->attributes;
                for(int j=0;j<pMap->length;j++)
                {
                    (*retString) += " ";
                    (*retString) += pMap->item[j]->nodeName;
                    (*retString) += " = \"";
                    (*retString) += (_bstr_t) pMap->item[j]->nodeValue;
                     (*retString) += "\" ";
                }
                if ( nodeList->item[i]->nodeName  == (_bstr_t)"xml" )
                {
                    (*retString) += "?>\r\n";
                }
                else
                {
                    (*retString) += ">";
                }

                //如果没有子节点,处理节点值.
                if ( nodeList->item[i]->childNodes->length == 1 )
                {
                    (*retString) += nodeList->item[i]->text;
                }
                //处理子节点    nodeList->item[i]->childNodes->length == 0 是声明部分
                else if ( nodeList->item[i]->childNodes->length >1 )
                {
                    (*retString) += "\r\n";
                    RanderNodeList(nodeList->item[i]->childNodes,retString);
                }

                //闭合节点.
                if ( nodeList->item[i]->nodeName  == (_bstr_t)"xml" )
                {
                     
                }
                else
                {
                    (*retString) += "</";
                    (*retString) += nodeList->item[i]->nodeName ;
                    (*retString) += ">\r\n";
                }

            }
            CoUninitialize();
        }
        主调用函数
        {
            CoInitialize(NULL);                                                //初始化 COM .
             IXMLDOMDocument2Ptr pxmlDoc;                                    //定义一个 Document 变量.
            MSXML2::IXMLDOMNodePtr pxmlNode;                                //定义一个 Node 变量.不知为什么,已经引用了命名空间,还要我再用命名空间.
            MSXML2::IXMLDOMNodeListPtr pxmlNode;

             _bstr_t str;
            pxmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));        //产生实例.查看定义可知 msxml4 中的 Document 接口的GUID描述为 DOMDocument40 .
            pxmlNode.CreateInstance(__uuidof(MSXML2::IXMLDOMNode));
            pxmlNode.CreateInstance(__uuidof(MSXML2::IXMLDOMNodeList));

            pxmlDoc->async = VARIANT_FALSE;                                    //默认为 VARIANT_TRUE ,不明白什么意思.
            hr = pxmlDoc->load( "L:\\ProcCode\\SendFileToConfig.xml" );        //加载文件.
            if ( hr ==  VARIANT_TRUE )                                        //如果成功.
            {
                pNodeList = pxmlDoc->childNodes ;
                RanderNodeList(pNodeList,&str);
                MessageBox(NULL, str ,"",0);
            }
3.    操作文件的例子:
    #include <fstream>
    #include "string"

    using namespace std;

    {
        std::ifstream ftext;
        std::string word;
       
          ftext.open("sendfileto.ini");
        if ( !ftext )
            exit (-1);
        while ( ftext >> word ) // 只要不超过 sizeof
        {
            if ( word == "[ListRoot]" )
            {
                while ( ftext >> word )
                {
                    if ( word == "" )            //去除左右空格.
                    {
                        break;
                    }
                    HTREEITEM hSub = m_ListFolder.InsertItem( word.data() );
     
                    AddFolder(word,hSub);
                }
            }
            vItem.push_back(word); // 将单词拷贝到向量
        }
        ftext.close();
    }
   
    void CSendFileToDlg::AddFolder(std::string FilePath,HTREEITEM hItem)
{
    CFileFind ff;
    HTREEITEM subItem;
    BOOL isOK ;
 
    FilePath.append( "\\*.*" );
    if ( isOK = ff.FindFile( FilePath.data() ) )
    {
        while( isOK )
        {
            isOK = ff.FindNextFile();
            if ( ff.IsDirectory() && ! ff.IsDots())
            {
                 subItem = m_ListFolder.InsertItem(ff.GetFileName().GetBuffer(),hItem) ;
             }
         }
     }
    return;
}

posted @ 2009-03-09 01:01  NewSea  阅读(299)  评论(0)    收藏  举报