码迷,mamicode.com
首页 > 编程语言 > 详细

C++ XML文件解析

时间:2017-04-14 20:24:39      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:last   blog   file   res   string   version   att   for   resource   

使用tinyxml2库,git地址https://github.com/leethomason/tinyxml2

只需要使用tinyxml2.h tinyxml2.cpp即可,同时需要using namespace tinyxml2

这里给出从官方test提取出的一些常用的操作

namespace XMLDemo {

static string fileNames[] = { "./resources/dream.xml",
        "./resources/utf8test.xml", "./resources/empty.xml",
        "./resources/utf8testverify.xml", };
static void timeTest() {
    XMLDocument* doc = new XMLDocument();
    clock_t startTime = clock();
    doc->LoadFile(fileNames[0].c_str());
    clock_t loadTime = clock();
    int errorID = doc->ErrorID();
    delete doc;
    doc = 0;
    clock_t deleteTime = clock();

    printf("Test file ‘%s‘ loaded. ErrorID=%d\n", fileNames[0].c_str(),
            errorID);
    if (!errorID) {
        printf("Load time=%lf sec\n",
                (double) (loadTime - startTime) / CLOCKS_PER_SEC);
        printf("Delete time=%lf sec\n",
                (double) (deleteTime - loadTime) / CLOCKS_PER_SEC);
        printf("Total time=%lf sec\n",
                (double) (deleteTime - startTime) / CLOCKS_PER_SEC);
    }
}
static void parseTest() {
    static const char* xml = "<?xml version=\"1.0\"?>"
            "<!DOCTYPE PLAY SYSTEM \"play.dtd\">"
            "<PLAY>"
            "<TITLE>A Midsummer Night‘s Dream</TITLE>"
            "</PLAY>";

    XMLDocument doc;
    doc.Parse(xml);

    XMLElement* titleElement = doc.FirstChildElement("PLAY")->FirstChildElement(
            "TITLE");
    const char* title = titleElement->GetText();
    printf("Name of play (1): %s\n", title);

    XMLText* textNode = titleElement->FirstChild()->ToText();
    title = textNode->Value();
    printf("Name of play (2): %s\n", title);
}
static void valueTest() {
    static const char* xml = "<information>"
            "    <attributeApproach v=‘2‘ />"
            "    <textApproach>"
            "        <v>2</v>"
            "    </textApproach>"
            "</information>";

    XMLDocument doc;
    doc.Parse(xml);

    int v0 = 0;
    int v1 = 0;

    XMLElement* attributeApproachElement =
            doc.FirstChildElement()->FirstChildElement("attributeApproach");
    attributeApproachElement->QueryIntAttribute("v", &v0);

    XMLElement* textApproachElement =
            doc.FirstChildElement()->FirstChildElement("textApproach");
    textApproachElement->FirstChildElement("v")->QueryIntText(&v1);

    printf("Both values are the same: %d and %d\n", v0, v1);
}
static void DOMTest() {
    // Test: Programmatic DOM
    // Build:
    //        <element>
    //            <!--comment-->
    //            <sub attrib="1" />
    //            <sub attrib="2" />
    //            <sub attrib="3" >& Text!</sub>
    //        <element>

    XMLDocument* doc = new XMLDocument();
    XMLNode* element = doc->InsertEndChild(doc->NewElement("element"));

    XMLElement* sub[3] = { doc->NewElement("sub"), doc->NewElement("sub"),
            doc->NewElement("sub") };
    for (int i = 0; i < 3; ++i) {
        sub[i]->SetAttribute("attrib", i);
    }
    element->InsertEndChild(sub[2]);
    XMLNode* comment = element->InsertFirstChild(doc->NewComment("comment"));
    comment->SetUserData((void*) 2);
    element->InsertAfterChild(comment, sub[0]);
    element->InsertAfterChild(sub[0], sub[1]);
    sub[2]->InsertFirstChild(doc->NewText("& Text!"));
    doc->Print();
    printf("-------------------------------------------------------------\n");
    // And now deletion:
    element->DeleteChild(sub[2]);
    doc->DeleteNode(comment);

    element->FirstChildElement()->SetAttribute("attrib", true);
    element->LastChildElement()->DeleteAttribute("attrib");
    doc->Print();
    printf("-------------------------------------------------------------\n");
    int value1 = 10;
    int value2 = doc->FirstChildElement()->LastChildElement()->IntAttribute(
            "attrib", 10);
    int result =
            doc->FirstChildElement()->LastChildElement()->QueryIntAttribute(
                    "attrib", &value1);

    doc->Print();
    printf("-------------------------------------------------------------\n");

    {
        XMLPrinter streamer;
        doc->Print(&streamer);
        printf("%s", streamer.CStr());
    }
    {
        XMLPrinter streamer(0, true);
        doc->Print(&streamer);
    }
    doc->SaveFile("./resources/pretty.xml");
    doc->SaveFile("./resources/compact.xml", true);
    delete doc;
}
static void attrTest() {
    const char* str = "<doc/>";

    XMLDocument doc;
    doc.Parse(str);

    XMLElement* ele = doc.FirstChildElement();

    int iVal, iVal2;
    double dVal, dVal2;

    ele->SetAttribute("str", "strValue");
    ele->SetAttribute("int", 1);
    ele->SetAttribute("double", -1.0);

    const char* cStr = ele->Attribute("str");
    ele->QueryIntAttribute("int", &iVal);
    cout << iVal << endl;
    ele->QueryDoubleAttribute("double", &dVal);

    ele->QueryAttribute("int", &iVal2);
    ele->QueryAttribute("double", &dVal2);
    cout << dVal2 << endl;

}
static void textTest() {
    const char* str = "<foo>This is  text</foo>";
    XMLDocument doc;
    doc.Parse(str);
    XMLElement* element = doc.RootElement();
    cout << element->GetText() << endl;
    element->SetText("abcd");
    cout << element->GetText() << endl;
    doc.Print();
    printf("-------------------------------------------------------------\n");
}
static void printerTest() {
    FILE* printerfp = fopen("resources/printer.xml", "w");
    XMLPrinter printer(printerfp);
    printer.OpenElement("foo");
    printer.PushAttribute("attrib-text", "text");
    printer.PushAttribute("attrib-int", int(1));
    printer.PushAttribute("attrib-unsigned", unsigned(2));
    printer.PushAttribute("attrib-int64", int64_t(3));
    printer.PushAttribute("attrib-bool", true);
    printer.PushAttribute("attrib-double", 4.0);
    printer.CloseElement();
    fclose(printerfp);

    XMLDocument doc;
    doc.LoadFile("resources/printer.xml");

    const XMLDocument& cdoc = doc;

    const XMLAttribute* attrib = cdoc.FirstChildElement("foo")->FindAttribute(
            "attrib-text");
    attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-int");
    cout << attrib->Value() << endl;
    attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-unsigned");
    cout << attrib->IntValue() << endl;
    attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-bool");
    cout << attrib->BoolValue() << endl;
    attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-double");
    cout << attrib->DoubleValue() << endl;
}


}

C++ XML文件解析

标签:last   blog   file   res   string   version   att   for   resource   

原文地址:http://www.cnblogs.com/tla001/p/6710666.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!