XML && TinyXml
2016-06-30 15:34
246 查看
XML 被设计为传输和存储数据,其焦点是数据的内容。HTML 被设计用来显示数据,其焦点是数据的外观。
下载完成后,解压找到tinyxml2.cpp 以及tinyxml2.h,并且添加到c++工程目录当中,与其他源码一起编译即可。
2、 XMLElement继承自XMLNode,但是只能操作XML中的元素。
一.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 与 JSON 优劣对比
- As3.0 xml + Loader应用代码
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- 实例解析Ruby程序中调用REXML来解析XML格式数据的用法
- Ruby中XML格式数据处理库REXML的使用方法指南
- C#中如何使用 XmlReader 读取XML文件
- C#针对xml基本操作及保存配置文件应用实例
- Ruby使用REXML库来解析xml格式数据的方法
- Ruby程序中创建和解析XML文件的方法
- Ruby的XML格式数据解析库Nokogiri的使用进阶
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- EBS xml publisher中文乱码问题及解决办法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总
- C# XML序列化方法及常用特性总结分析
- SQL Server中的XML数据进行insert、update、delete