1 / 51

2014/11/6

XML 解析操作. Version1.0. 2010 年 5 月. 2014/11/6. 课程介绍 XML 文件介绍 XML 文件的解析 利用 TinyXML 解析 XML 文档 参考资料. Overview. 课程目标 预备知识 目标听众 日程表 词汇表. 课程介绍. 理解 XML 文档结构 理解 XML 文档的解析流程 掌握第三方库 TinyXML 进行 XML 文件的解析. 课程目标. VC++ 设计基础 C/C++ 程序设计基础. 预备知识. 项目经理 软件开发人员 其他人员. 目标听众. 共计: 0.5 天 详细安排.

olivia-hyde
Download Presentation

2014/11/6

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. XML 解析操作 Version1.0 2010年5月 2014/11/6

  2. 课程介绍 XML文件介绍 XML文件的解析 利用TinyXML解析XML文档 参考资料 Overview

  3. 课程目标 预备知识 目标听众 日程表 词汇表 课程介绍

  4. 理解XML文档结构 理解XML文档的解析流程 掌握第三方库TinyXML进行XML文件的解析 课程目标

  5. VC++设计基础 C/C++程序设计基础 预备知识

  6. 项目经理 软件开发人员 其他人员 目标听众

  7. 共计:0.5天 详细安排 日程表

  8. XML-可扩展标记语言(eXtensible Markup Language) DOM-文档对象模型 XSL-可扩展样式表语言 (EXtensible Stylesheet Language)。 Xpath-XML路径语言(XML Path Language) DTD-文档类型描述(Document Type Definition) SGML-标准通用标记语言 词汇表

  9. 课程介绍 XML文件介绍 XML文件的解析 利用TinyXML解析XML文档 参考资料 Overview

  10. XML发展历史 XML从1995年开始形成,1998年二月发布XML1.0标准。XML的前身是SGML(the Standard Generalized Markup Language)是IBM从1960年开始发展的GML标准化后的名称。 GML概念: 1.档案中能够明确的将标示和内容分开 2.所有档案的标记使用方法均一致 1978年ANSI将GML加以整理规范,发布成为SGML,1986年起为ISO采用,并被运用到各种大型的档案计划中,但是SGML是一种非常严格的档案描述法,难以理解和学习,进而影响推广应用。 XML文件介绍

  11. 同时W3C也发现HTML的问题: 1.不能解决所有解释资料的问题-影音或化学公式,音乐符号 2.效能问题-需要下载整份档案,才能开始对档案做搜寻 3.扩充性,弹性,易读性均不佳。 为了解决以上问题,专家们使用SGML精简制作,并依照HTML的发展经验,产生出一套使用上规则的严谨,但是简单的描述资料语言:XML。 XML文件介绍

  12. XML用途 XML被广泛用来作为跨平台之间互动数据的形式,主要针对数据的内容,通过不同的格式化描述手段XSLT,CSS等可以完成最终的形势表单(生成对应的HTML,PDF或者其他的档案格式) XML设计用来传输及携带资料资讯,不用来表现或展示资料,HTML语言则用来表现资料,所以XML用途的焦点是它说明资料是什么,以及携带资料资讯。 XML文件介绍

  13. XML应用 XML应用面主要分为两种类型,文档型和数据型: 1. 自定义XML+XSLT=>HTML XML存放整个文档的XML数据,然后XSLT将XML转换,解析,结合XSLT的HTML标签,最终成为HTML,显示在浏览器上。 2.XML作为微型数据库,这是最常见的数据型应用。 利用相关XMLAPI(MSXML DOM,JAVA DOM等)对XML进行存取和查询,留言板的实现中,就经常可以看到用XML作为数据库。完全以XML相关技术为基础的数据库系统如:eXist。 3.作为信息传递的载体,典型的就是WEB SERVICE 将数 XML文件介绍

  14. 将数据包装成XML来传递,但这里的XML已经有了特定的规格,既SOAP(简单对象访问协议)将数据包装成XML来传递,但这里的XML已经有了特定的规格,既SOAP(简单对象访问协议) 4.应用程序的配置信息数据。 如J2EE配置WEB服务器的WEB.xml 5.其他一些文档的XML格式。 6.保存数据间的映射关系。 如Hibernate。 这几种常见应用中,可以根据应用广泛程度,分为:自定义XML和特定意义XML。1和2属于自定义XML的范畴,3到6则属于特定意义XML。或者说是XML的延伸。 XML文件介绍

  15. XML展现形式 <?xml version="1.0" encoding="UTF-8"?> <Persons> <Person ID="1"> <name>周1</name> <age>20</age> </Person> </Persons> 第一行是XML声明,它定义XML的版本(1.0)和所使用的编码(UTF-8). 第二行描述文档的根元素。 第三,四,五元素文档的元素。 XML文件介绍

  16. XML结构 XML文档形成了一个树结构,它“从根部”开始,然后扩展到枝叶。并且XML文档必须有一个根元素,该元素是其他元素的父元素。 XML文件介绍 <Persons>根 <Person>元素 ID 属性 <Name>元素 <age>元素 文本:周1 文本:20

  17. XML语法规则 1. 所有XML元素都必须有关闭标签。 <name> 周明</name> 在XML声明没有关闭标签,这不是错误,声明不属于XML本身的组成部分,它不是XML元素,也不需要关闭标签。 2.XML标签对大小写敏感。 <Message> 这是错误的 </message> 3.XML必须正确地嵌套。 <outb><inner>Thies text is bold</inner></outb> 正确嵌套的意思是:由于<inner>元素是在<outb>元素内打开,那么它必须在<outb>元素内关闭。 XML文件介绍

  18. 4.XML文档必须有根元素。 XML文档必须有一个元素是所有其他元素的父元素,该元素称为根元素。 5.XML的属性值必须加引号。 <Person ID=1>……</Person> 6.实体引用 在XML中,一些字符拥有特殊意义。如果直接把字符放入文档,则会出错。为了避免这个错误,采用实体引用。 如:&lt;< &gt; > &amp; & &apos; ‘ &quot “; 7.XML中的注释 。 <!– this Is a comment --> 8. 在XML中,空格会被保留。 XML文件介绍

  19. XML元素 XML元素指的是从开始标签(包括)直到结束标签(包括)的部分。 XML元素可包含其他元素,文本或者两者的混合物,并且元素也可以拥有属性。 <Persons>,<Person>都拥有其他元素, <name>只有文本内容。 <Person>拥有元素。 XML文件介绍 <Persons> <Person ID="1"> <name>周1</name> <age>20</age> </Person> </Persons>

  20. XML元素命名规则 XML元素必须遵循以下命名规则: 1.名称可以包含字母,数字以及其他的字符。 2.名称不能以数字或者标点符合开始 3.名称不能以字符XML开始 4.名称不能包含空格 5.可以使用任何名称,没有保留的字词。 XML文件介绍

  21. XML属性 属性提供了有关元素的额外信息,通常提供不属于数据组成部分的信息。 XML属性必须被引号包围,不过单引号和双引号均可用。<person sex=“man”> ,<person sex=‘man’> ---如果属性值本身包含双引号,那么有必要使用单引号包围它。如: <gangster name='George "Shotgun" Ziegler'> XML文件介绍

  22. XML属性(VS 元素) 没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用子元素。我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用子元素吧。 XML文件介绍

  23. 避免XML属性 使用属性而引起的一些问题: 1. 属性无法包含多重的值(元素可以) 2. 属性无法描述树结构(元素可以) 3. 属性不易扩展(为未来的变化( 4. 属性难以阅读和维护 <note day="08" month="08" year="2008" to="George" from="John" heading="Reminder" body="Don't forget the meeting!"> </note> XML文件介绍

  24. XML验证 拥有正确语法的 XML 被称为“形式良好”的 XML。 通过某个 DTD 进行了验证的 XML 是“合法”的 XML 一个"形式良好"的 XML 文档会遵守前几章介绍过的 XML 语法规则: 1.XML 文档必须有根元素 2.XML 文档必须有关闭标签 3.XML 标签对大小写敏感 4.XML 元素必须被正确的嵌套 5.XML 属性必须加引号 XML文件介绍

  25. XML验证 一个合法的 XML 文档是"形式良好"的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE note SYSTEM "Note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构 <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> XML文件介绍

  26. 课程介绍 XML文件介绍 XML文件的解析 利用TinyXML解析XML文档 参考资料 Overview

  27. XML解析模型 SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。这种方式占用内存少,速度快,但用户程序相应得会比较复杂。 DOM(文档对象模型),则是在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,速度往往慢于SAX,但可以给用户提供一个面向对象的访问接口,对用户更为友好。  同时提供了SAX和DOM接口的库,是在底层先实现SAX,再在SAX的基础上实现DOM XML文件介绍

  28. 课程介绍 XML文件介绍 XML文件的解析 利用TinyXML解析XML文档 参考资料 Overview

  29. TinyXML介绍 TinyXML是目前非常流行的一款基于DOM模型的XML解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。 TinyXML

  30. TinyXML类结构 TiXmlBase:其他类的基类,是个抽象类 TiXmlNode:表示一个节点,包含节点的一般方法,如访问自节点、兄弟节点、编辑自身、编辑子节电TiXmlDocument:表示整个XML文档,不对应其中某个特定的节点。 TiXmlElement:表示元素节点,可以包含子节点和 TiXmlComment:表示注释 TiXmlDeclaration:表示声明 TiXmlText:表示文本节点 TiXmlUnknown:表示未知节点,通常是出错了 TiXmlAttribute:表示一个元素的属性 TinyXML

  31. TinyXML类结构关系图 TinyXML

  32. TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像< ***=“ ”>,其中***就是一个属性,引号里面的就是属性值。 TinyXML

  33. 1. 各个节点类都从TiXmlNode继承,在使用时常常需要将TiXmlNode*类型的指针转换为其派生类的指针,在进行这种转换时,应该首先使用由 TiXmlNode类提供的一系列转换函数,如ToElement(void),而不是c++的dynamic_cast。 2.由于TinyXml是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含我们预期的某个节点,在这种情况下,TinyXml将返回空指针。因此,必须要对返回值进行检查,否则将很容易出现内存访问的错误。 TinyXML

  34. TiXmlDocument 1.创建一个空的文档对象,然后载入一个xml文档 TiXmlDocument doc();doc.LoadFile("tutorial.xml"); 2.文档类提供了Print()函数用于在控制台输出当前的文档内容 doc.Print(); //输出文档 3.可以使用SaveFile()函数来进行另存为。 doc.SaveFile(“tutorial.txt”); 4.文档对象还提供了一个实用的函数用于返回第一个根对象。 TiXmlElement* RootElement() TinyXML

  35. TiXmlDeclaration 在标准的XML文件中,声明为文件的第一项 //使用TinyXml的声明对象TiXmlDeclaration *decl;decl = doc.FirstChild()->ToDeclaration(); 然后就可以使用它的功能了,它可以让你返回当前的版本,编码等信息,函数原形如下:const char *Version() constconst char *Encoding() constconst char *Standalone() const TinyXML

  36. TiXmlElement 元素为一个容器类,它具有元素名称,并可以包含其它元素,文本,注释和未知节点,这些对象统称为元素的节点,即节点可以为元素、文本、注释和未知节点类型。元素也可以包含任意个数的属性。 1.节点名: 你可以通过如下的函数来设置和返回它。const std::string& ValueStr() const void SetValue( const std::string& _value ) 2.父节点: 通过Parent()函数来返回指向父节点对象的指针,Parent()函数的声明如下:TiXmlNode* Parent() TinyXML

  37. 3.子节点 通过父节点的指针,可以遍历所有的子节点: TiXmlNode* FirstChild(); TiXmlNode* FirstChild( const std::string& _value ); 以上两个函数用于返回第一个子节点对象的指针,带参数名的那个函数表示返回第一个名为_value的子节点。 TiXmlNode* LastChild(); TiXmlNode* LastChild( const std:: string& _value) 以上两个函数用于返回最后一个节点对象的指针,带参数名的那个函数表示返回最后一个名为_value的子节点。 你也可以使用IterateChildren()函数来依次遍历所有的节点 TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) TinyXML

  38. 4.插入子节点 TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) 上面三个函数用于插入节点,InsertEndChild函数让你把新节点插入到末尾,InsertBeforeChild和InsertAfterChild函数允许你在指定的节点位置前后插入节点 ReplaceChild函数用于替换指定的节点: TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) TinyXML

  39. RemoveChild函数让你删除指定的节点 bool RemoveChild( TiXmlNode* removeThis ); Clear函数会删除本节点的所有子节点(包括子节点包含的从子节点),但不会修改本节点。 void Clear(); TinyXML

  40. 5.同级节点操作 根据当前的节点,返回上一个节点的指针 TiXmlNode* PreviousSibling(); const TiXmlNode* PreviousSibling( const std::string& _value ) const 根据当前的节点,返回下一个节点的指针 TiXmlNode* NextSibling() TiXmlNode* NextSibling( const std::string& _value) 函数NextSiblingElement用于返回下一个同级元素 TiXmlElement* NextSiblingElement() TiXmlElement* NextSiblingElement( const std::string& _value) TinyXML

  41. 返回第一个子元素: TiXmlElement* FirstChildElement()TiXmlElement* FirstChildElement( const std::string&_value ) TinyXML

  42. 元素属性 属性一般保存在元素中,它们为使用“=”号连接的两个字符串,左边的表示属性名,等号右边的表示属性值,通常使用字符串、整数和浮点数等数据类型表示 1.获取属性: const std::string* Attribute( const std::string&name ) ;const std::string* Attribute( const std::string& name, int* i );const std::string* Attribute( const std::string&name, double* d );在上面3个函数中,第一个函数使用字符串保存返回的属性值,第二个函数把属性值转换为整数然后返回,第三个函数把属性值转换为浮点数然后返回。不过,第二、三个函数都会以字符串的形式记录属性值,并作为函数的返回值返回。 TinyXML

  43. 2.设置属性: void SetAttribute( const std::string&name, const std::string&_value );void SetAttribute( const std::string&name, int _value );void SetDoubleAttribute( const char * name, double value ); 3. 查找属性: FirstAttribute和LastAttribute可以让你返回第一个和最后一个属性,它们的函数声明如下:TiXmlAttribute* FirstAttribute()TiXmlAttribute* LastAttribute() 4.删除属性删除指定名称的属性,它的函数声明如下:void RemoveAttribute( const std::string&name ) TinyXML

  44. 元素函数总结 ValueStr //返回元素名称SetValue //设置元素名称Parent //返回父节点对象 FirstChild //返回第一个子节点LastChild //返回最后一个子节点IterateChildren //返回下一个子节点 InsertEndChild //在最后一个子节点后插入子节点InsertBeforeChild //在指定的子节点前插入子节点InsertAfterChild //在指定的子节点后插入子节点ReplaceChild //替换指定的子节点RemoveChild //删除指定的子节点Clear //删除所有的子节点 TinyXML

  45. 元素函数总结 PreviousSibling //返回同级中前一个节点NextSibling //返回同级中后一个节点 NextSiblingElement //返回同级中后一个元素FirstChildElement //返回第一个子元素节点Attribute //返回元素中的属性值QueryValueAttribute //返回元素中的属性值SetAttribute //设置元素中的属性值FirstAttribute //返回元素中第一个属性对象LastAttribute //返回元素中最后一个属性对象RemoveAttribute //删除元素中指定的属性对象 TinyXML

  46. 使用TinyXML1.首先下载TinyXML库的文件。 2.下载后解压这个压缩包,解压到一个目录。 3.在TinyXML的目录里面找到tinystr.h,tinyxml.h,tinystr.cpp,tinyxml.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp六个文件加入到自己的项目中。 4.如果要在工程中使用STL,打开tinyxml.h,在第一行加入下面这行:#defineTIXML_USE_STL //标志使用STL的内容 5.在要使用TinyXML的文件里面包含#include “tinyxml.h”。 TinyXML

  47. 使用TinyXML例子 1.用程序建立文档对象: TinyXML { TiXmlDocument doc;     TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );     doc.LinkEndChild( decl );     TiXmlElement * element = new TiXmlElement( "Hello" );     doc.LinkEndChild( element );     TiXmlText * text = new TiXmlText( "World" );     element->LinkEndChild( text );     doc.SaveFile( "madeByHand2.xml" );}

  48. 2.用程序读取XML文档: TinyXML TiXmlDocument * myDocument=new TiXmlDocument("demo.xml"); bool bReult; bReult=myDocument->LoadFile(); if (bReult) { TiXmlElement *RootElement=myDocument->RootElement();//根节点 TiXmlElement *FirstPerson=RootElement->FirstChildElement();//Person TiXmlElement *NameElement; TiXmlElement *AgeElement; while(FirstPerson) { NameElement=FirstPerson->FirstChildElement();//获取Person元素的Name属性 AgeElement=NameElement->NextSiblingElement();//获取Person元素的Age属性 FirstPerson=FirstPerson->NextSiblingElement(); } }

  49. 课程介绍 XML文件介绍 XML文件的解析 利用TinyXML解析XML文档 参考资料 Overview

  50. [1] 《XML 入门指南》 [2] 《TinyXML Tutorial 中文指南》。 TinyXML

More Related