XML从入门到放弃

大耗子 2020年06月16日 125次浏览

文章链接:https://codemouse.online/archives/2020-06-16

XML 简介

目的

使用 XML 标记语言可以做到数据或数据结构在任何编程语言环境下的共享。例如 我们在某个计算机平台上用某种编程语言编写了一些数据或数据结构,然后用 XML 标 记语言进行处理,那样的话,其他人就可以在其他的计算机平台上来访问这些数据或数 据结构,甚至可以用其他的编程语言来操作这些数据或数据结构了。这就是 XML 标记 语言作为一种数据交换语言存在的价值。

XML和HTML的区别

XML 和 HTML 都是用于操作数据或数据结构,在结构上大致是相同的,但它们在本质上却存在着明显的区别,它们的区别主要有以下几点:

  1. 语法要求不同:在 HTML 中不区分大小写,在 XML 中对大小写要求非常严格。
  2. 标记不同:HTML 使用固有的标记,而 XML 没有固有标记。
  3. 作用不同:HTML 用于显示页面,而 XML 用于描述页面内容的数据或数据的结 构。HTML 把数据和显示合在一起,在页面中把这些数据显示出来,而 XML 则 将数据和显示分开。

XML 的优势

每种语言的产生都能完成某些特定的功能,XML 作为一种标记语言也不例外。XML 最大的优势在于它能对各种编程语言编写的数据进行管理,使得在任何平台下都能通过 解析器来读取 XML 数据。它的优势可归纳为以下几点:

  1. 数据的搜索:在 XML 中可以提取文档中任何位置的数据
  2. 数据的显示:XML 将数据的结构和数据的显示形式分开,根据需要使数据呈现 出多种显示方式。如 HTML、PDF 等格式。
  3. 数据的交换: XML 标记语言的语法非常简单,可以通过解析器在任何机器上解读。并可以在各种计算机平台上使用。逐渐成为一种数据交换的语言。

XML 文档的组成

XML 文档也属于纯文本文件,该文档一般如下四部分组成,前三部分都是可选的:

  1. XML 文档的声明
  2. XML 文档类型定义
  3. XML 文档注释
  4. XML 标识及其内容(主体)
    按照这种文档格式来编写的一个 XML 文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?> 
<!--XML 文档注释--> 
<?xml:stylesheet type="text/xsl"href="stu.xsl"?> 
<!--班级中学生的信息--> 
<class> 
    <student> 
        <name>Jone</name> 
        <age>20</age> 
    </student> 
</class> 

XML 的语法规则

XML 的语法规则既简单又严格,非常容易学习,在使用过程中只需认真仔细,没有 多大困难。一般 XML 的语法规则大致可归纳为以下几点:

所有 XML 元素都须有关闭标签。

在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签:
例如:
<p></p>
这个<p>就是开标签,</p>就是闭标签,元素前带/的就是闭标签

XML 标签对大小写敏感

XML 元素使用 XML 标签进行定义。
XML 标签对大小写敏感。在 XML 中,标签 <Letter> 与标签 <letter> 是不同的。 必须使用相同的大小写来编写打开标签和关闭标签:
<Message>这是错误的。</message>
<message>这是正确的。</message>

XML 必须正确地嵌套

在 XML 中,所有元素都必须彼此正确地嵌套:
例如:
<b><i>This text is bold and italic</i></b>
正确嵌套的意思是:由于 <i> 元素是在 <b> 元素内打开的,那么它必须在 <b> 元素内关闭。

XML 文档必须有根元素

XML 文档必须有一个元素且只能有一个是所有其他元素的父元素。该元素称为根元素。

<root>
    <child> 
        <subchild>.....</subchild> 
    </child> 
</root>

XML 的属性值须加引号

与 HTML 类似,XML 也可拥有属性(名称/值的对)。 在 XML 中,XML 的属性值须加引号。例如:
<note date=08/08/2008>错误的</note>
<note date="08/08/2008">正确的</note>

实体引用

在 XML 中,一些字符拥有特殊的意义。 如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
例如:

<message>if salary < 1000 then</message> 
为了避免这个错误,请用一个实体引用来代替 "<" 字符: 
<message>if salary &lt; 1000 then</message>

在 XML 中,有 5 个预定义的实体引用:
| 实体名 | 表示的符号 |
| ------ | ---------- |
|&lt; |< |
|&gt; |> |
|&amp; |& |
|&apos; |' |
|&quot; |" |

XML 中的注释

在 XML 中编写注释的语法与 HTML 的语法很相似:

元素

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。 元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
例如:

<bookstore> 
    <book category="CHILDREN"> 
        <title>Harry Potter</title> 
        <author>J K. Rowling</author> 
        <year>2005</year> 
        <price>29.99</price> 
    </book> 
</bookstore>

<bookstore> 和 <book> 都拥有元素内容,因为它们包含了其他元素。
<author> 只有文本内容,因为它仅包含文本。
在上例中,只有<book> 元素拥有属性 (category="CHILDREN")。

XML命名规则

XML 元素必须遵循以下命名规则:

  • 名称可以含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字符 “xml”(或者 XML、Xml)开始
  • 名称不能包含空格
  • 可使用任何名称,没有保留的字词。

命名习惯

使名称具有描述性。使用下划线的名称也很不错。

  • 名称应当比较简短,比如:<book_title>,而不是<the_title_of_the_book>。

  • 避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为你需要提取第一个单词。

  • 避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。

  • 避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。

  • XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。

  • 有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。

TinyXML2库

  • Tinyxml2 简介 TinyXML2 是简单实用的开源的 C++XML 文件解析库,可以很方便的应用到现有的项 目之中。TinyXML2 解析器相对 TinyXML1 在代码上是完全重写,使其更适合于游戏开发 中使用。它使用更少的内存,更快,并使用更少的内存分配。
  • 由于 XML 的树状结构,TinyXML2 将 XML 的节点抽象为 XMLNode,XML 中除了把属 性 key-value 抽象为 XMLAttribute 类型外,其余的都看作 XMLNode 的子类,首先将整个 XML 文档抽象为 XMLDocument,将声明部分抽象为 XMLDeclaration,将注释抽象为 XMLComment,将元素抽象为 XMLElement,将文本抽象为 XMLText。

TinyXML2 安装

下载地址 https://github.com/leethomason/tinyxml2
使用 git 下载tinyxml2

git clone https://github.com/leethomason/tinyxml2.git

安装

#进入相应目录并编译 
cd tinyxml2/ 
cmake . 
make 

#测试该版本的准确性 
./xmltest

#安装
sudo make install 

TinyXML2的API调用

从文件中加载xml

tinyxml2::XMLDocument doc; 
doc.LoadFile( "test.xml" ); 
std::cout << doc.ErrorID() << std::endl;

从内存加载 XML

static const char* xml = "<element/>";
tinyxml2::XMLDocument doc;
doc.Parse( xml ); 
std::cout << doc.ErrorID() << std::endl;

demo

下载链接 https://codemouse.online/upload/2020/6/tinyxml2-e7885cd32a4a4678b473320d1dc5a836.rar