加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML && TinyXml

发布时间:2020-12-16 02:20:18 所属栏目:百科 来源:网络整理
导读:XML 被设计为传输和存储数据,其焦点是数据的内容。HTML 被设计用来显示数据,其焦点是数据的外观。 一.XML标签主要语法规则: 1、 XML 文档第一行一般是XML声明,定义了版本以及使用的编码2、 XML DTD合法模块的定义3、 XML 文档必须有根元素4、 XML 文档必

XML 被设计为传输和存储数据,其焦点是数据的内容。HTML 被设计用来显示数据,其焦点是数据的外观。

一.XML标签主要语法规则:

1、  XML 文档第一行一般是XML声明,定义了版本以及使用的编码
2、  XML DTD合法模块的定义
3、  XML 文档必须有根元素
4、  XML 文档必须有关闭标签
5、  XML 标签对大小写敏感
6、  XML 元素必须被正确的嵌套
7、  XML 属性必须加引号

二、使用TinyXML2来解析xml文档

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

三、tinyXML2的环境搭建

下载网址https://github.com/leethomason/tinyxml2
下载完成后,解压找到tinyxml2.cpp 以及tinyxml2.h,并且添加到c++工程目录当中,与其他源码一起编译即可。

四、使用XMLDocument类来加载XML文档:

创建test.xml
-----------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE PLAY SYSTEM "play.dtd">
<!--hello world-->
<hello>world<hello>
-----------------------------------------------------------------
创建test.cpp      

#include "tinyxml2.h"
#include <iostream>
using namespace tinyxml2;
using namespace std;
int main()
{
    XMLDocument doc;
    doc.LoadFile("test.xml");//使用XMLDocument加载xml文件
    doc.SaveFile("test.xml");   //写入文档
    cout<<"doc Error = "<<doc.Error()<<endl; 
    //使用int ErrorID()获取错误码 返回值为0,代表无错误。
    return 0;
}

五、使用XMLDocument类来加载内存中的XML:

int main()
{
    static const char* xml =         //xml char* buffer
        "<?xml version="1.0"?>"
        "<PLAY>"
        "<TITLE v = "2">hello</TITLE>"
        "</PLAY>";

    XMLDocument doc;
    doc.Parse( xml );        //加载buffer中的xml,如果解析出错,
                            //则doc.Error()返回非零错误。
    cout<<"doc Error = "<<doc.Error()<<endl;
}

六、关于XMLNode ,XMLElement的用法

1、 XMLNode可以操作XML中的申明、注释、DTD、以及元素
2、 XMLElement继承自XMLNode,但是只能操作XML中的元素。

七、读取、插入、删除XML中的申明

将XMLNode转换成XMLDeclaration

创建test.xml
--------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE PLAY SYSTEM "play.dtd">
<!--hello world-->
<hello>world</hello>
--------------------------------------------------------
int main()
{
    XMLDocument doc;
    doc.LoadFile( "test.xml" );
    XMLDeclaration * declaration = doc.FirstChild()->ToDeclaration();
    const char * pDeclaration = declaration->Value();
    cout<<"Declaration:"<<pDeclaration<<endl;



    doc.DeleteNode(declaration);
    doc.Print();

    doc.InsertFirstChild( doc.NewDeclaration("xml version="1.1" encoding="UTF-8"") );
    doc.Print();


    //doc.SaveFile("test.xml");
    return 0;
}

八、通过XMLElement读取、插入、修改、删除元素。

创建test.xml --------------------------------------------------------
<?xml version="1.0"?>
<title>world</title> --------------------------------------------------------
int main()
{
    XMLDocument doc;
    doc.LoadFile( "test.xml" );

    //XMLElement *titleElement  = doc.RootElement();
    XMLElement *titleElement  =  doc.FirstChildElement( "title" );  //索引title元素
    if(titleElement == NULL)
    {
        cout<<"not find element title,errorID:"<<doc.ErrorID()<<endl;
        return -1;
    }

    const char* pTitle = titleElement->GetText();  
    cout<<"title1 : "<<pTitle<<endl;




    //通过另一种方式查找TITLE元素,GetTex()等价于ToText()->Value()
    XMLText* textNode = titleElement->FirstChild()->ToText();
    pTitle = textNode->Value();
    cout<<"title2 : "<<pTitle<<endl;


    titleElement->SetText("world2");  //修改titleElement元素中的内容
    doc.Print();

    XMLElement* element = doc.NewElement( "element" );
    doc.InsertEndChild(element); //在xml末尾插入element元素。
    doc.Print();

    XMLElement * sub = doc.NewElement( "sub" ); //在element元素中插入一个sub元素。 element->InsertEndChild(sub);
    doc.Print();

    element->DeleteChild(sub);  //删除element元素中的sub元素 doc.Print();

    doc.DeleteChild(titleElement); //删除title元素

    //doc.SaveFile("test.xml");
    cout<<"error : "<<doc.ErrorID()<<endl;
    return 0;
}
设置元素属性,删除元素属性,读取元素属性并且类型转换,读取元素内容并且类型转换。
int main()
{
    const char* str = "<doc attr0='1' attr1='2.0' attr2='foo' ><v>2</v></doc>";

    XMLDocument doc;
    doc.Parse( str );

    XMLElement* ele = doc.FirstChildElement();

    int iVal,result;
    double dVal;

    result = ele->QueryDoubleAttribute( "attr0",&dVal ); //将属性转换成double
    cout<<"result1 : "<<result<<" dVal = "<<dVal<<endl;

    result = ele->QueryIntAttribute( "attr1",&iVal );
    cout<<"result2 : "<<result<<" dVal = "<<iVal<<endl; //将属性转换成int

    result = ele->QueryIntAttribute( "attr2",&iVal );  //属性值转换错误
    cout<<"result3 : "<<result<<" dVal = "<<iVal<<endl;


    result = ele->FirstChildElement("v")->QueryIntText(&iVal); //将元素的内容转换成int
    cout<<"result4 : "<<result<<" dVal = "<<iVal<<endl;


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


    ele->DeleteAttribute("str");
    ele->DeleteAttribute("int");
    ele->DeleteAttribute("str");
    doc.Print();

    return 0;
}

九、读取、删除、注释,并且写入xml文档。

创建test.xml
--------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE PLAY SYSTEM "play.dtd">
<!--hello world 1-->
<hello>
    <!--hello world 2-->
    <world>world</world>
</hello>
--------------------------------------------------------
int main()
{
    XMLDocument doc;
    doc.LoadFile( "test.xml" );


    doc.Print();

    XMLNode *comment1 = doc.FirstChild()->NextSibling()->NextSibling();
    //读取根节点的注释
    XMLElement *hello = doc.FirstChildElement( "hello" );
    XMLNode *comment2 = hello->FirstChild(); //hello元素的注释
    XMLElement *world = hello->FirstChildElement(); 
    //hello元素的第一个子元素,注意FirstChild与FirstChildElement的用法


    cout<<"comment1:"<<comment1->Value()<<endl;
    cout<<"comment2:"<<comment2->Value()<<endl;
    cout<<"comment2:"<<world->Value()<<endl;


    XMLComment* c1 = comment1->ToComment();
    cout<<"comment1:"<<c1->Value()<<endl;

    doc.DeleteChild(comment1);
    hello->DeleteChild(comment2);
    doc.Print();

    //在hello元素中插入一个注释
    hello->InsertFirstChild(doc.NewComment( "comment1" ));
    doc.Print();

    //在<!DOCTYPE PLAY SYSTEM "play.dtd">插入一个注释
    doc.InsertAfterChild(doc.FirstChild()->NextSibling(),doc.NewComment( "comment2" ));

    doc.Print();

    //doc.SaveFile( "test.xml" );
    return 0;
}

十、读取、插入、删除dtd

创建test.xml
--------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE PLAY SYSTEM "play.dtd">
--------------------------------------------------------
int main()
{

    XMLDocument doc;
    doc.LoadFile( "test.xml" );
    XMLUnknown *dtd = doc.FirstChild()->NextSibling()->ToUnknown();
    cout<<"dtd : "<<dtd->Value()<<endl;

    doc.DeleteChild(dtd);

    //在<?xml version="1.0"?>后面插入dtd
    doc.InsertAfterChild( doc.FirstChild(),doc.NewUnknown("DOCTYPE PLAY SYSTEM "play2.dtd""));
    doc.Print();

    //doc.SaveFile("test.xml");
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读