XML(一)XML大揭秘

时间:2023-11-10 12:53:13

前言

每天都要学习很多新的知识,比你厉害的程序员比你还努力,那你混的下这口饭吗?所以不抱怨,坚持!接下来给大家分享的是xml。可能很多做开发的都遇到过xml,

比如maven,各种框架的配置文件都有,但是你有没有深入的去了解一下xml呢?xml是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

一、XML简介

1.1、XML简单的历史介绍

  1969年 GML (General Markup Language,通用标记语言):
    用于计算机之间的通信,通信就会传输数据,那么就需要一种数据的规范。
  1985年 SGML (Standard General Markup Language,标准通用标记语言):对GML进行完善。
  1993年 HTML (Hyper Text Markup Language,超文本的标记语言):
    随着万维网的推广,在SGML的基础上,又出现了HTML语言,用于万维网上的页面展示。
  1998年 XML (Extensible Markup Language,可扩展的标记语言):
    HTML有不少的缺陷,HTML语言的标记不能自定义,只能使用固定的有限的标记;
    HTML语言的标记本身不能用来描述数据,HTML语言的标记没有国际化(不同浏览器显示同一页面的效果可能不一样),只侧重于对内容的显示。
    随着Web上数据的增多,这些HTML存在的缺点就变的不可被忽略。
    W3C提供了HTML的几个扩展用来解决这些问题,最后,W3C组织在1998年推出了可扩展标记语言XML。

1.2、认识XML

  XML指可扩展标记语言(Extensible Markup Language)
  XML是一种标记语言,很类似HTML
  XML的设计宗旨是传输数据,而非显示数据。
  XML标签没有被预定义,您需要自行定义标签
  XML被设计为具有自我描述性
  XML是 W3C 的推荐标准

1.3、XML与HTML的主要差异

  XML不是HTML的替代,XML和HTML为不同的目的而设计。
  XML被设计为传输和存储数据,其焦点是数据的内容。
  HTML被设计用来显示数据,其焦点是数据的外观。
  HTML旨在显示信息,而XML旨在存储和传输信息。

1.4、XML的作用

  数据传输,数据可读性高,可扩展。使用XML文件传输数据,现在已经被越来越多的项目所采纳。
  结构化明确,自我描述能力强,描述带关系的数据(作为软件的配置文件),如tomcat、mybatis、hibernate、spring,struts等
  充当小型文本数据库。

二、XML文档规则——如何构建一个良构的XML文档

2.1、XML文档必须有根元素

  XML必须包含根元素,它是所有其他元素的父元素,比如:

  以下实例中“root”就是根元素:

// 1    <root>
// 2 <child>
// 3 <subchild>.....</subchild>
// 4 </child>
// 5 </root>

  以下实例中“note”是根元素:  

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

2.2、XML声明

  XML声明是XML文件的可选部分,如果存在必须放在文档的第一行,如下所示:

  <?xml version="1.0" encoding="utf-8"?>

  以上实例包含XML版本,以及该XML文档所使用的编码;
  UTF-8也是HTML5,CSS,JavaScript,PHP和SQL的默认编码。

2.3、所有的XML元素都必须有一个关闭标签

  在HTML中,某些元素不必有一个关闭标签;例如:

<p>This is a paragraph.
<br>

  在XML中,省略关闭标签是非法的。所有元素都必须有关闭标签:

<p>This is a paragraph.</p>
<br />

  <class />中间没有数据可以写成这样

2.4、XML对大小写敏感

  XML标签对大小写敏感。标签<Letter>与标签<letter>是不同的。
  必须使用相同的大小写来编写开始标签和结束标签:
    <Message>This is incorrect</message> // 错误的XML标签书写
    <message>This is correct</message> // 正确的XML标签书写

2.5、XML必须正确嵌套

  在HTML中,常会看到没有正确嵌套的元素:<b><i>This text is bold and italic</b></i>
  在XML中,所有元素都必须彼此正确地嵌套:<b><i>This text is bold and italic</i></b>

2.6、XML属性值必须加引号

与HTML类似,XML元素也可拥有属性(名称/值的对),并且在同一标签中属性不能重复。
在XML中,XML的属性值必须加引号,而且必须有值(就算一个空格也行)。

<!-- 错误的属性书写方式 -->
<note date=//>
<to>Tove</to>
<from>Jani</from>
</note> <!-- 正确的属性书写方式 -->
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>

2.7、PCDATA与CDATA

  PCDATA(Parsed Character Data):指可以被xml解析器解析的内容,有些特殊字符需要借助实体来被解析器解析,XML中的正常内容都是属于PCDATA。
  CDATA(Character Data):指不会被xml解析器解析的内容,按照字符串原样输出。
    语法:<![CDATA[要原样输出的内容]]>
    如:<![CDATA["你好啊 &amp;&quot;&apos;abc"]]>
    输出结果:"你好啊 &amp;&quot;&apos;abc"

2.8、实体引用

  在XML中,一些字符拥有特殊的意义。如果您把字符"<"放在XML元素中,会发生错误,这是因为解析器会把它当作新元素的开始。以下实例会产生XML错误:
    <message>if salary < 1000 then</message>
  为了避免这个错误,请用实体引用来代替 "<" 字符:
    <message>if salary &lt; 1000 then</message>
  在XML中,有5个预定义的实体引用:

&lt;    <    less than(小于号)
&gt; > greater than(大于号)
&amp; & ampersand(与)
&apos; ' apostrophe(单引号)
&quot; " quotation mark(双引号)

  自定义实体:
  语法:
    <!DOCTYPE 根元素名[
      <!ENTITY 实体名 实体内容 >
      <!ENTITY 实体名 实体内容 >
    ...
    ]>
  例如:相同的内容重复出现,可以定义一个实体
    <!DOCTYPE students[
       <!ENTITY address "江西省南昌市南昌县">
    ]>
  实体名:address,使用方法:&address;实体可出现的位置:标签内容,属性值,以及作为其他实体的值。
  注:重复定义相同名称的实体时,以写在第一位的为准。

2.9、XML中的注释

  在XML中编写注释的语法与HTML的语法很相似。<!-- This is a comment -->
  注释可以出现在任意位置。
  注释不可嵌套使用。

2.10、XML的空格问题

  HTML会把多个连续的空格字符裁减(合并)为一个。例如:
    代码:<p>这是 两 本书</p>
    显示:这是 两 本书
  在XML中,把多个连续的空格字符裁减(合并)为一个。
    代码:<p>这是 两 本书</p>
    显示:这是 两 本书

2.11、XML的树形结构

  XML文档形成了一种树型结构,它从“根部”开始,然后扩展到“枝叶”。叶子:文本标签(没有具体体现)的值
  XML文档必须包含根元素。该元素是所有其他元素的父元素。
  XML文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
  所有的元素都可以有子元素。
  父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。
  所有的元素都可以有文本内容和属性(类似HTML)。
  注:更多关于XML树形结构请参见:http://www.runoob.com/xml/xml-tree.html

三、XML的处理指令与命名空间的问题

3.1、XML的处理指令

  处理指令,简称PI(Processing Instruction),处理指令告诉我们解析引擎采用什么方式解析xml文档内容;
  处理指令以“<?”开头,以“?>”结尾,xml头部声明就是最常见的一种处理指令,告诉解析器采用什么字符编码解析内容。
  xml文档中可以有多个处理指令。

  举例:xml-stylesheet处理指令,通知解析引擎使用css文件去显示xml文档内容

    <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="style.css" ?>
<students>
<name>张三</name>
<age></age>
</students> style.css: name{
font-size:30px;
color:red;
}
age{
font-size:50px;
color:green;
}

  处理指令很少被使用。主要用于链接XML文档到样式表。

3.2、XML的命名空间

  在XML中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。

  举例:

    在students1.xml中:

    <students>
<student>
<name>张三</name>
</student>
<student>
<name>李四</name>
</student>
</students>

students1.xml

    在students2.xml中:    

    <students>
<student>
<name>张三</name>
</student>
<student>
<name>李四</name>
</student>
</students>

students2.xml

  两个文档中都有students、student标签,一起使用时会发生命名冲突 

  解决方法:
  1)使用命名空间
    语法:xmlns:namespace-prefix="namespaceURI"(一般都是公司的域名)
    使用范围:当前标签以及子标签

    在students1.xml中:

    <students1:students xmlns:students1="http://briup.com/students1">
<students1:student>
<students1:name>张三</students1:name>
</students1:student>
<students1:students>

students1.xml

  与仅仅使用前缀不同,我们为<students>标签添加了一个xmlns属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。
  当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
  注:用于标示命名空间的url不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。

  2)使用默认的命名空间

    为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作
    语法:xmlns="namespaceURL"

    <students xmlns="http://briup.com/students1">
<student>
<name>张三</name>
</student>
<students>

students1.xml