当前位置:编程学习 > XML/UML >>

c++ tinyxml查找utf8 xml元素并读取

最近,是用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.zzzyk.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--; 
        } 
  <

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,