• <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:整個TinyXML模型的基類。
                    TiXmlAttribute:對應(yīng)于XML中的元素的屬性。
                    TiXmlNode:對應(yīng)于DOM結(jié)構(gòu)中的節(jié)點。
                    TiXmlComment:對應(yīng)于XML中的注釋。
                    TiXmlDeclaration:對應(yīng)于XML中的申明部分,即<?versiong="1.0" ?>。
                    TiXmlDocument:對應(yīng)于XML的整個文檔。
                    TiXmlElement:對應(yīng)于XML的元素。
                    TiXmlText:對應(yīng)于XML的文字部分。
                    TiXmlUnknown:對應(yīng)于XML的未知部分。
                    TiXmlHandler:定義了針對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> 



            整個對象樹:

            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ào)FirstChild函數(shù)的節(jié)點與要找的節(jié)點必父子關(guān)

            句柄

            想要健壯地讀取一個XML文檔,檢查方法調(diào)用后的返回值是否為null是很重要的。一種安全的檢錯實現(xiàn)可能會產(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. 



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

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

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

            <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
            <ZXML>
                
            <ZAPP>
                     
            <VBS_RUNTIME_PARAMS>
                           
            <BROADCAST_VERSION info="版本">8</BROADCAST_VERSION>
                           
            <Broadcast>
                            
            <FileCount info="資源文件個數(shù)">69</FileCount>
                            
            <SOURCE_1>
                                
            <ID info="圖片編號">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="圖片編號">2</ID>
                                
            <Version info="圖片版本">1</Version>
                                
            <FileMode info="文件處理模式">0</FileMode>
                            
            </SOURCE_2>
                            .
                            
            </Broadcast>
                     
            </VBS_RUNTIME_PARAMS>
                
            </ZAPP>
            </ZXML>


            要設(shè)置BROADCAST_VERSION節(jié)點的值 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é)點,屬性值

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

            例如刪除BROADCAST_VERSION節(jié)點

            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);

            也可以刪除整個SOURCE_1節(jié)點:

            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()方法實現(xiàn)遞歸刪除.

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

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

            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é)點:

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

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

            亂碼是由于GB2312與UTF8之間轉(zhuǎn)換不當(dāng)造成的,tinyxml在處理UTF8本身沒有問題,當(dāng)你打開一個UTF8的文檔,可以在加載的時候指定UTF8的方式,或者文檔聲明處指明的編碼格式,tinyxml會按照相應(yīng)的編碼格式加載,但很多時候當(dāng)我們輸出或?qū)懭胫形淖侄螘r會出現(xiàn)亂碼,無論在內(nèi)存,還是打印出來的內(nèi)容.這是因為我們的軟件通常是GB2312編碼,而讀取或?qū)懭氲膬?nèi)容是UTF8,自然就會出錯.可以借助網(wǎng)上的兩個函數(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ù)自己實現(xiàn)轉(zhuǎn)換.以上是簡單應(yīng)用的幾個舉例,理解他們,相信你已經(jīng)能寫出滿足自己需要的代碼了.

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

            Feedback

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

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

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

            問一個:
            你是把代碼打包成lib使用的?還是直接把代碼加到項目里面的?

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

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

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

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

            樓上是說把tinyxml的操作再封裝一層到lib吧?引用這個lib的時候會報錯?要具體看一下哪個操作的時候出錯了  回復(fù)  更多評論   

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

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

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

            把這個tinyxml制作成lib的靜態(tài)庫,編譯通過了卻在調(diào)試的時候一直報0x00000005類似的不可讀取得錯誤
            是因為在先編譯tinyxml的時候的run-time lib的時候是和你用的項目不同的原因。只要改成相同的就OK了  回復(fù)  更多評論   

            国产精品一区二区久久精品无码 | 久久99国产精品尤物| 久久人妻少妇嫩草AV无码专区| 麻豆AV一区二区三区久久| 久久香蕉一级毛片| 一本大道久久东京热无码AV| 久久亚洲精品成人AV| 精品久久久无码中文字幕| 亚洲中文久久精品无码ww16| 久久99国产亚洲高清观看首页| 一本久久免费视频| 99久久精品国产高清一区二区| 久久久久久久综合综合狠狠| 欧美va久久久噜噜噜久久| 亚洲国产成人久久精品99| 一本久久a久久精品vr综合| 99久久国产免费福利| 久久久久亚洲av无码专区| 亚洲欧洲久久av| 久久久精品人妻无码专区不卡 | 亚洲精品高清久久| 久久婷婷激情综合色综合俺也去| 久久香蕉国产线看观看猫咪?v| 99久久成人国产精品免费| 日本欧美久久久久免费播放网| 一极黄色视频久久网站| 色婷婷久久久SWAG精品| 青青草国产97免久久费观看| 国产精品成人99久久久久91gav| 97久久超碰国产精品旧版| 日韩AV无码久久一区二区| 囯产精品久久久久久久久蜜桃| 久久亚洲精品国产精品婷婷| 色婷婷噜噜久久国产精品12p| 国产成人精品久久亚洲高清不卡 | 九九99精品久久久久久| 国产成人久久精品区一区二区| 久久久无码一区二区三区| 91精品国产高清久久久久久io| 久久国产精品无码HDAV| 狠色狠色狠狠色综合久久 |