• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            elva

            tinyxml使用筆記與總結(jié)

             

            在TinyXML中,根據(jù)XML的各種元素來定義了一些類:
                    TiXmlBase:整個(gè)TinyXML模型的基類。
                    TiXmlAttribute:對(duì)應(yīng)于XML中的元素的屬性。
                    TiXmlNode:對(duì)應(yīng)于DOM結(jié)構(gòu)中的節(jié)點(diǎn)。
                    TiXmlComment:對(duì)應(yīng)于XML中的注釋。
                    TiXmlDeclaration:對(duì)應(yīng)于XML中的申明部分,即<?versiong="1.0" ?>。
                    TiXmlDocument:對(duì)應(yīng)于XML的整個(gè)文檔。
                    TiXmlElement:對(duì)應(yīng)于XML的元素。
                    TiXmlText:對(duì)應(yīng)于XML的文字部分。
                    TiXmlUnknown:對(duì)應(yīng)于XML的未知部分。
                    TiXmlHandler:定義了針對(duì)XML的一些操作。

            例如:

            <?xml version="1.0" standalone=no>
            <!– Our to do list data –>
            <ToDo>
            <Item priority="1"> Go to the <bold>Toy store!</bold></Item>
            <Item priority="2"> Do bills</Item>
            </ToDo> 



            整個(gè)對(duì)象樹:

            TiXmlDocument "demo.xml"
            TiXmlDeclaration "version=’1.0′" "standalone=no"
            TiXmlComment " Our to do list data"
            TiXmlElement "ToDo"
            TiXmlElement "Item" Attribtutes: priority = 1
            TiXmlText "Go to the "
            TiXmlElement "bold"
            TiXmlText "Toy store!"
            TiXmlElement "Item" Attributes: priority=2
            TiXmlText "Do bills"

            tinyXML中,用FirstChild"名字"節(jié)點(diǎn)時(shí),調(diào)FirstChild函數(shù)的節(jié)點(diǎn)與要找的節(jié)點(diǎn)必父子關(guān)

            句柄

            想要健壯地讀取一個(gè)XML文檔,檢查方法調(diào)用后的返回值是否為null是很重要的。一種安全的檢錯(cuò)實(shí)現(xiàn)可能會(huì)產(chǎn)生像這樣的代碼:

             

            TiXmlElement* root = document.FirstChildElement( "Document" );
            if ( root )
            {
            TiXmlElement
            * element = root->FirstChildElement( "Element" );
            if ( element )
            {
            TiXmlElement
            * child = element->FirstChildElement( "Child" );
            if ( child )
            {
            TiXmlElement
            * child2 = child->NextSiblingElement( "Child" );
            if ( child2 )
            {
            // Finally do something useful. 



            用句柄的話就不會(huì)這么冗長了,使用TiXmlHandle類,前面的代碼就會(huì)變成這樣:

            TiXmlHandle docHandle( &document );
            TiXmlElement
            * child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child"1 ).ToElement();
            if ( child2 )
            {
            // do something useful 

            一、讀取XML,設(shè)置節(jié)點(diǎn)文本
            如下XML片段:

            <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
            <ZXML>
                
            <ZAPP>
                     
            <VBS_RUNTIME_PARAMS>
                           
            <BROADCAST_VERSION info="版本">8</BROADCAST_VERSION>
                           
            <Broadcast>
                            
            <FileCount info="資源文件個(gè)數(shù)">69</FileCount>
                            
            <SOURCE_1>
                                
            <ID info="圖片編號(hào)">1</ID>
                                
            <Version info="圖片版本">1</Version>
                                
            <Path info="圖片路徑">/mnt/share/1.bmp</Path>
                                
            <FileMode info="文件處理模式">0</FileMode>
                            
            </SOURCE_1>
                            
            <SOURCE_2>
                                
            <Path info="圖片路徑">/mnt/share/2.bmp</Path>
                                
            <ID info="圖片編號(hào)">2</ID>
                                
            <Version info="圖片版本">1</Version>
                                
            <FileMode info="文件處理模式">0</FileMode>
                            
            </SOURCE_2>
                            .
                            
            </Broadcast>
                     
            </VBS_RUNTIME_PARAMS>
                
            </ZAPP>
            </ZXML>


            要設(shè)置BROADCAST_VERSION節(jié)點(diǎn)的值 8為其他值,可參考如下代碼(將值加1):
            用ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )方法替換

                TiXmlDocument doc("zapp.conf");
                doc.LoadFile();
                TiXmlHandle docHandle( 
            &doc );
            TiXmlElement
            * Broadcast_ver = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VERSION").ToElement();
                TiXmlNode 
            * oldnode =  Broadcast_ver->FirstChild();
               
            const char *ver = Broadcast_ver->GetText();
                
            int oldVer = atoi(ver);
                CString newVer;
                newVer.Format(
            "%d",oldVer+1);
                TiXmlText newText(newVer);
                Broadcast_ver
            ->ReplaceChild(oldnode,newText);
                AfxMessageBox(Broadcast_ver
            ->GetText());//輸出值
               
            doc.SaveFile();

            二,刪除節(jié)點(diǎn),屬性值

            RemoveChild( TiXmlNode* removeThis )方法刪除父節(jié)點(diǎn)的子節(jié)點(diǎn),
            RemoveAttribute( const char * name )方法刪除屬性值.

            例如刪除BROADCAST_VERSION節(jié)點(diǎn)

            TiXmlHandle docHandle( &doc );
                TiXmlElement
            * Broadcast_ver = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").ToElement();

                TiXmlNode 
            * node =  Broadcast_ver->FirstChild("BROADCAST_VERSION");

                Broadcast_ver
            ->RemoveChild(node);

            也可以刪除整個(gè)SOURCE_1節(jié)點(diǎn):

            TiXmlHandle docHandle( &doc );
                TiXmlElement
            * Broadcast = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();

                TiXmlNode 
            * node =  Broadcast->FirstChild("SOURCE_1");

                Broadcast
            ->RemoveChild(node);

            刪除BROADCAST_VERSION的info屬性:

            TiXmlHandle docHandle( &doc );
                TiXmlElement
            * Broadcast_ver = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VERSION").ToElement();

                Broadcast_ver
            ->RemoveAttribute("info"); //刪除info

            可以借助NextSiblingElement()方法實(shí)現(xiàn)遞歸刪除.

            三,添加節(jié)點(diǎn),屬性值

            例如在SOURCE_3下添加BROADCAST_PID節(jié)點(diǎn):

            TiXmlHandle docHandle( &doc );
                TiXmlElement
            * Broadcast = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();
                TiXmlElement
            * Broadcast_Pid = new TiXmlElement("BROADCAST_PID");
                TiXmlText 
            *text =new TiXmlText("7215");
                Broadcast_Pid
            ->SetAttribute("info","the pid");
                Broadcast_Pid
            ->LinkEndChild(text);
                Broadcast
            ->LinkEndChild(Broadcast_Pid);

            將在SOURCE_3后添加新的節(jié)點(diǎn):

            <BROADCAST_PID info="the pid">7215</BROADCAST_PID>

            四,最后說一下中文亂碼的問題

            亂碼是由于GB2312與UTF8之間轉(zhuǎn)換不當(dāng)造成的,tinyxml在處理UTF8本身沒有問題,當(dāng)你打開一個(gè)UTF8的文檔,可以在加載的時(shí)候指定UTF8的方式,或者文檔聲明處指明的編碼格式,tinyxml會(huì)按照相應(yīng)的編碼格式加載,但很多時(shí)候當(dāng)我們輸出或?qū)懭胫形淖侄螘r(shí)會(huì)出現(xiàn)亂碼,無論在內(nèi)存,還是打印出來的內(nèi)容.這是因?yàn)槲覀兊能浖ǔJ荊B2312編碼,而讀取或?qū)懭氲膬?nèi)容是UTF8,自然就會(huì)出錯(cuò).可以借助網(wǎng)上的兩個(gè)函數(shù)來實(shí)現(xiàn)轉(zhuǎn)換(原作者不詳):

                void ConvertUtf8ToGBK(CString& strUtf8) 
                
            {
                    
            int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
                    unsigned 
            short * wszGBK = new unsigned short[len+1];
                    memset(wszGBK, 
            0, len * 2 + 2);
                    MultiByteToWideChar(CP_UTF8, 
            0, (LPCTSTR)strUtf8, -1, wszGBK, len);

                    len 
            = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
                    
            char *szGBK=new char[len + 1];
                    memset(szGBK, 
            0, len + 1);
                    WideCharToMultiByte (CP_ACP, 
            0, wszGBK, -1, szGBK, len, NULL,NULL);

                    strUtf8 
            = szGBK;
                    delete[] szGBK;
                    delete[] wszGBK;
                }



                
            void ConvertGBKToUtf8(CString& strGBK)
                
            {
                    
            int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
                    unsigned 
            short * wszUtf8 = new unsigned short[len+1];
                    memset(wszUtf8, 
            0, len * 2 + 2);
                    MultiByteToWideChar(CP_ACP, 
            0, (LPCTSTR)strGBK, -1, wszUtf8, len);

                    len 
            = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
                    
            char *szUtf8=new char[len + 1];
                    memset(szUtf8, 
            0, len + 1);
                    WideCharToMultiByte (CP_UTF8, 
            0, wszUtf8, -1, szUtf8, len, NULL,NULL);

                    strGBK 
            = szUtf8;
                    delete[] szUtf8;
                    delete[] wszUtf8;
                }

            當(dāng)然,你也可以用MultiByteToWideChar,WideCharToMultiByte函數(shù)自己實(shí)現(xiàn)轉(zhuǎn)換.以上是簡單應(yīng)用的幾個(gè)舉例,理解他們,相信你已經(jīng)能寫出滿足自己需要的代碼了.

            posted on 2008-04-24 16:28 葉子 閱讀(43160) 評(píng)論(5)  編輯 收藏 引用 所屬分類: XML

            Feedback

            # re: tinyxml使用筆記與總結(jié) 2008-12-18 16:34 shiweifu

            感謝LZ分享經(jīng)驗(yàn)
            很有用!  回復(fù)  更多評(píng)論   

            # re: tinyxml使用筆記與總結(jié) 2009-01-05 11:24 wangwang

            問一個(gè):
            你是把代碼打包成lib使用的?還是直接把代碼加到項(xiàng)目里面的?

            我把這個(gè)tinyxml制作成lib的靜態(tài)庫,編譯通過了卻在調(diào)試的時(shí)候一直報(bào)0x00000005類似的不可讀取得錯(cuò)誤。

            把這個(gè)直接加入項(xiàng)目里調(diào)試,完全能通過,無論編譯還是調(diào)試都能通過。

            你有何好的建議來調(diào)試lib的〉  回復(fù)  更多評(píng)論   

            # re: tinyxml使用筆記與總結(jié) 2009-01-06 09:11 elva

            樓上是說把tinyxml的操作再封裝一層到lib吧?引用這個(gè)lib的時(shí)候會(huì)報(bào)錯(cuò)?要具體看一下哪個(gè)操作的時(shí)候出錯(cuò)了  回復(fù)  更多評(píng)論   

            # re: tinyxml使用筆記與總結(jié) 2010-01-17 22:14 billow

            好東西啊,正在學(xué)習(xí)使用呢。  回復(fù)  更多評(píng)論   

            # re: tinyxml使用筆記與總結(jié) 2010-03-03 09:59 vodi

            把這個(gè)tinyxml制作成lib的靜態(tài)庫,編譯通過了卻在調(diào)試的時(shí)候一直報(bào)0x00000005類似的不可讀取得錯(cuò)誤
            是因?yàn)樵谙染幾gtinyxml的時(shí)候的run-time lib的時(shí)候是和你用的項(xiàng)目不同的原因。只要改成相同的就OK了  回復(fù)  更多評(píng)論   

            国内精品九九久久精品| 国产精品欧美久久久久无广告 | 少妇无套内谢久久久久| 99久久人人爽亚洲精品美女| 狼狼综合久久久久综合网| 伊人久久久AV老熟妇色| 国产精品久久久久久久久软件 | 久久99精品久久久久子伦| 亚洲狠狠婷婷综合久久久久| 久久精品国产亚洲av麻豆图片 | 国产69精品久久久久久人妻精品| 亚洲精品国产综合久久一线| 日本精品久久久久影院日本 | 国产69精品久久久久观看软件| 久久精品国产亚洲7777| 性做久久久久久免费观看| 久久久WWW免费人成精品| 性欧美大战久久久久久久| 久久久久久久久66精品片| 久久久久久精品久久久久| 亚洲级αV无码毛片久久精品| 看久久久久久a级毛片| 国产日产久久高清欧美一区| 97精品伊人久久大香线蕉app| 久久亚洲高清观看| 久久国产免费直播| 久久这里只有精品首页| 亚洲精品白浆高清久久久久久 | 狠狠久久综合伊人不卡| 久久AV无码精品人妻糸列| 国产精品一久久香蕉国产线看观看 | 久久久久久综合网天天| 久久久久亚洲AV成人片| 日本免费一区二区久久人人澡| 91久久香蕉国产熟女线看| 久久综合精品国产一区二区三区| 99精品国产免费久久久久久下载 | 久久精品国产亚洲av水果派 | 精品人妻伦九区久久AAA片69| 日韩人妻无码精品久久久不卡| 中文字幕成人精品久久不卡|