XML 被设计为传输和存储数据,其焦点是数据的内容。HTML 被设计用来显示数据,其焦点是数据的外观。
@H_502_3@一.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;
}
@H_308_403@九、读取、删除、注释,并且写入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;
}