程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++ tinyxml查找utf8 xml元素並讀取

c++ tinyxml查找utf8 xml元素並讀取

編輯:C++入門知識

最近,是用xml比較多。但是網上的這方面的資料特別少。我就自己弄了個。。使用的是tinyxml類,他具體怎麼用可以看我另一篇博文。
c++ 使用TinyXml讀寫Xml
這裡有簡單的實例包括編譯,下面的程序,只是一個簡單的查詢過程,具體的還需要大家在用的時候去完成。我也是嘗試成功後就發布了。可能並不滿足大家的需要,大家拿去用,可能還要改改。。。。
我讀取的xml是
[html] 
<?xml version="1.0" encoding="UTF-8"?> 
<list> 
    <dict id="1" key="english" > 
        <key>english</key> 
        <acceptation>英語;英語語言;英格蘭人;(英國)純正英語; 
        </acceptation> 
        <pos>adj.</pos> 
        <acceptation>英格蘭的;英國的;英語的;用英語寫的; 
        </acceptation> 
    </dict> 
    <dict id="2" key="one" > 
        <key>one</key> 
        <acceptation>(數字)一;一個;(基數)一,第一; 
        </acceptation> 
        <pos>n.</pos> 
        <acceptation>一個人;一點鐘;一體;獨一; 
        </acceptation> 
    </dict> 
    <dict id="3" key="key" > 
        <key>key</key> 
        <pos>vt.</pos> 
        <acceptation>鍵入;鎖上;調節…的音調;提供線索;</acceptation> 
    </dict> 
</list> 

調用入口:
[html] 
    char *file = "egxml.xml";   
    TiXmlDocument xmlDoc(file);   
    xmlDoc.LoadFile();  
    TiXmlElement* pRootElement = xmlDoc.RootElement();  //獲取跟節點 
 
    TiXmlElement* pElesele = selectXml(pRootElement,"2","id");  //查找節點 
    string msg = ""; 
    msg += dumpNode(pElesele,0);  //讀取該節點所有數據 

查找節點函數
[cpp]  www.2cto.com
TiXmlElement* CegDlg::selectXml(TiXmlElement *pRootElement,string strVal,string strName)  //跟目錄節點,查詢屬性值,查詢屬性 

    TiXmlElement* pEle = NULL;   
    string msg = ""; 
    TiXmlElement* reEle = NULL;  //用於返回 
    for (pEle = pRootElement->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())    //循環下面所有節點 
    {     
        // recursive find sub node return node pointer  
        int t = pEle->Type(); 
        TiXmlElement * pElement = pEle->ToElement();     //轉換至節點 
        TiXmlAttribute * pAttr = pElement->FirstAttribute();  //獲取第一個屬性 
        TiXmlAttribute * pNextAttr =NULL;   
        if(pAttr != NULL) 
        {    
            string tmpAttrVal = ""; 
            string tmpAttrName = ""; 
            do 
            {                            
                tmpAttrVal = pAttr->Value(); //屬性值 
                tmpAttrName = pAttr->Name(); //屬性name 
                if(tmpAttrVal == strVal && tmpAttrName == strName) 
                {    
                    return reEle = pElement;  //找到就返回當前節點 
                    break; 
                } 
            }while(pAttr = pAttr->Next());  //轉移到下一個屬性 
        }    
    } 
    return reEle; 

讀取所有數據
[html] 
string CegDlg::dumpNode(TiXmlNode * pNode,int flag) 
{    
    string msg = ""; 
    if(pNode == NULL) 
    { 
        return ""; 
    } 
    TiXmlText * pText = NULL; 
    TiXmlNode * pChildNode = NULL; 
    int t = pNode->Type(); 
    if(t == TiXmlText::TINYXML_TEXT)  //節點類型是text節點 
    { 
        pText = pNode->ToText(); 
        string text = pText->Value(); 
        if(!text.empty()) 
        { 
            msg = msg + "="+ text; 
        } 
  
  
    } 
    else if(t == TiXmlText::TINYXML_ELEMENT) //節點類型是Element 
    { 
        msg = msg + "rn"; 
        int num = flag; 
        while(num >= 1) 
        { 
            msg = msg + "t"; 
            num--; 
        } 
  
        msg = msg + pNode->Value(); 
  
        //輸出屬性 
        TiXmlElement * pElement = pNode->ToElement(); 
  
        TiXmlAttribute * pAttr = pElement->FirstAttribute(); 
        TiXmlAttribute * pNextAttr =NULL; 
        string tmpAttrMsg = "["; 
        if(pAttr != NULL) 
        {    
            string tmpAttrVal = ""; 
            string tmpAttrName = ""; 
            do 
            {                            
                tmpAttrVal = pAttr->Value(); 
                tmpAttrName = pAttr->Name(); 
                tmpAttrMsg += tmpAttrName+"=" + tmpAttrVal+","; //各個屬性之間用逗號分隔 
            }while(pAttr = pAttr->Next()); 
            tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_last_of(",")); 
        } 
        tmpAttrMsg += "]"; 
        msg += tmpAttrMsg; 
  
    } 
    //循環訪問它的每一個元素 
    for(pChildNode=pNode->FirstChild();pChildNode!=0;pChildNode = pChildNode->NextSibling()) 
    { 
  
        msg = msg + dumpNode(pChildNode,flag+1); 
  
    } 
    return msg; 
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved