您的位置:首页 > 其它

XML && TinyXml

2016-06-30 15:34 246 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml