C++ XML文件解析

使用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;
}

}
时间: 2024-07-28 23:34:48

C++ XML文件解析的相关文章

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

XML文件解析之JDOM解析

1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2的版本是2.0.5,JDOM1的版本是1.1.3,根据官网中的介绍可以知道.JDOM是一个在基于内存的XML模型,它用于读写创建修改XML文档.JDOM和DOM相似因为他们都提供了内存XML文档模型,但是DOM被设计用于很多种语言(C,C++,ECMSctipr,Java,JScript,Lingo

java基础之概谈xml文件解析

XML已经成为一种很通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.诸多web应用框架,其可配置的编程方式,给我们的开发带来了很大程度的便捷,但细细想来,它们的应用无一不是java bean与xml之间的转换解析.本文将对xml的两种操作标准DOM和SAX,从它们各自的特点.适用范围等方面进行简单介绍. DOM (Document Object Model) :DOM标准中,采用W3C标准表示XML,有多重语言支持,因此其跨平台性很好.采用DOM规范

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)

XML文件解析器TXml

前几天看了开源的XML文件解析器TinyXml,它是怎么实现解析的没怎么看懂,于是决定自己实现一个,反正最近不忙.先命名为TXml.现在完成了解析和查询功能,全部代码加起来不到1000行,将会继续完善它.源码必共享 先简单说一下我的思路: 1:读取XML文件信息,并存入一个字符数组中: 2:遍历数组,将数组解析成一棵树: 3:以路径的方式查询和按属性查询: 这个解析器最麻烦的地方就在怎么将字符数组解析成一颗树.我们先看一下一个简单XML文件,他包括文件头.节点.节点名称及节点值.属性名称及属性值

八、Android学习第七天——XML文件解析方法(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:extensible markup language 定义:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 解析XML的方式: SAX——Simple API for XML,既是一种接口,也是一个软件包采用的是事件驱动,也就是它解析

Win10系列:VC++ XML文件解析

XML文件按照元素标记来存储数据,通过遍历这些元素标记可以得到XML文件中所保存的数据.在C++/CX的类库中并未定义用于解析XML文件的类,但C++提供了能解析XML文件的框架和类库,如msxml4.libxml.IXMLDOM和TinyXML等,在使用C++/CX编写应用程序时可以通过C++提供的框架和类库来解析XML文件.TinyXML是一个轻量级解析XML的框架,本节将介绍如何使用此框架来解析一个XML文件. TinyXML框架包含了以下的类和函数,通过使用这些类和函数可以方便地读取一个

通过正则表达式实现简单xml文件解析

这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node对象.xml文档树上的每一个节点都是一个Node对象,对象拥有title.attribute和text三个自身变量以及一个childrenNode集合. 一.编写Node类 import java.io.Serializable; import java.util.HashMap; import j

JAVA之XML文件解析

在Java.Android开发中,xml文件的解析很重要.本人使用过的xml文件解析的方式有两种,一种是DOM文档解析.还有一种是SAX. DOM是基于文档树结构的.SAX是基于事件驱动的.SAX则是遇到标签则触发工作的.当解析器发现元素开始.元素结束.文本.文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据.优缺点很明显:DOM对于大型文件的操作不好(因为它要先读入整个文档到内存中),SAX为了解决这样问题.不用事先调入整个文档,占用资源少:SAX解析器代码比DOM解析器代

dtd与schema的区别&amp;XML文件解析常用方式

Schema和DTD 都是用来定义各种文件中XML标记的使用规范.Schema是标准的XML文件,而DTD则使用自己的特殊语法,因此,只需要知道XML的语法规则就可以编写Schema了,不需要再学习其它语法规则.可以使用相同的处理器来解读,Schema利用命名空间将文件中特殊的节点与Schema说明相联系,一个XML文件可以有多个对应的Schema,若是DTD的话,一个XML文件只能有一个相对应的DTD文件.Schema的内容模型是开放的,可以随意扩充,而DTD则无法解读扩充的内容.DTD只能把