C++ rapidxml的使用

解析步驟

1 讀取xml文件內容
 以文件流的方式讀取xml文件到char型數組中

char* ReadFiel(const char* fileName)
{
    FILE* file = fopen(fileName,"rb");
    if (file==0)
    {
        return 0;
    }
    fseek(file,0,SEEK_END);
    size_t len = ftell(file);
    fseek(file,0,SEEK_SET);
    char* data = new char[len+1];
    memset(data,0,len+1);
    fread(data,1,len,file);
    fclose(file);
    return data;
}

2 解析xml

void AnalysisXML()
{
    char* xml = ReadFiel("case.xml");
    if (xml==0)
    {
        return;
    }
    rapidxml::xml_document<> doc;       //創建xml文檔對象
    rapidxml::xml_node<>*    root;      //創建xml節點(根節點)
    rapidxml::xml_node<>*    childNode;  //創建xml節點(子節點)
    try
    {
        doc.parse<0>(xml);             //解析xml文檔
        root = doc.first_node();       //得到根節點
        childNode= root->first_node(); //得到根節點下的第一個子節點
        for (;childNode;childNode=childNode->next_sibling())//遍歷childNode的兄弟節點
        {
            //獲取節點的屬性,並賦值給xml文檔的節點屬性對象xml_attribute<>* attrxxx
            rapidxml::xml_attribute<>* attrName = childNode->first_attribute("name");
            rapidxml::xml_attribute<>* attrStart = childNode->first_attribute("start");
            rapidxml::xml_attribute<>* attrEnd = childNode->first_attribute("end");
            rapidxml::xml_attribute<>* attrFile = childNode->first_attribute("file");
            //輸出屬性值
            cout<<attrName->value()<<endl;
            cout<<attrStart->value()<<endl;
            cout<<attrEnd->value()<<endl;
            cout<<attrFile->value()<<endl;
        }
    }
    catch (...)
    {

    }
    delete []xml;
}

總結如下:

轉自:http://blog.csdn.net/angellove156/article/details/50623914
解析xml文件:
首先,通過文件讀取IO流,
然後,將IO流,轉換爲char數組 buffer

解析buffer內的數據:

1 創建xml doc:
xml_doument<> doc;
2 解析數據:
doc.parse<0>(buffer), 0 是按照默認方式進行解析

3 xml的 構成:
xml_node<>:
xml_attribute<>

4 包含關係:
xml_node<> 包含 xml_attribute<>
xml_attribute<>是 鍵值對的形式:
name 對應一個屬性值

5 獲取根節點:
xml_node<> *root_node = doc.first_node()
如果找某個名字的節點:
xml_node<> *nameNode = root_node->first_node(“name”);
找同一個名字的其它節點:
xml_node<> *anotherNode = nameNode->next_sibling();

如果找某個節點的 某個名字的屬性:
方法可以參考 找某個名字的節點
得到屬性的值:
調用其value方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章