XML笔录

最近经常碰到XML,所以今天学习了下,这里分享下笔记

(1)简介及来源:

      XML 是可扩展标记语言(Extensible Markup Language)的缩写,被设计用来传输和存储数据,其中的 标记(markup)是关键部分。

      可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。创建的文件,或文档实例 由元素(标记)和内容构成。当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档。元素的描述性越强,文档各部分越容易识别。自从出现标记至今,带有标记的内容就有一个优势,即在计算机系统缺失时,仍然可以通过标记理解打印出来数据。

      标记语言从早期的私有公司和政府制定形式逐渐演变成标准通用标记语言(Standard Generalized Markup Language,SGML)、超文本标记语言(Hypertext Markup Language,HTML),并且最终演变成 XML。SGML 比较复杂,HTML(实际上仅是一组元素集)在识别信息方面不够强大。XML 则是一种易于使用和易于扩展的标记语言。

(2)XML与HTML对比:

首先声明XML 和 HTML 为不同的目的而设计,并且不是 HTML 的替代,理解这一点很重要。对 XML 最好的描述是:XML 是独立于软件和硬件的信息传输工具

①XML 被设计用来传输和存储数据,主要是负责数据的内容;且无预定义标签,所以可以自己创建标签,这个在下面介绍;空格会保留

②HTML 被设计用来显示数据,主要负责数据的展示;且有预定义标签;空格会被裁减成一个

【XML详解:】

1 . 一种很像HTML的标记语言,设计宗旨是传输数据,而不是显示数据。

且标签没有被预定义,需要自行定义标签。被设计为具有自我描述性,是 W3C 的推荐标准(1998.02)

2 . XML 不会做任何事情

也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。

下面实例是 Jani 写给 Tove 的便签,存储为 XML:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

 上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。

但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

3.可以自己创建标签

上面实例中的标签没有在任何 XML 标准中定义过(比如 <to> 和 <from>)。这些标签是由 XML 文档的创作者发明的。

这是因为 XML 语言没有预定义的标签,而HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p>、<h1> 等等)。

XML 允许创作者定义自己的标签和自己的文档结构。

4.适用性

XML 是各种应用程序之间进行数据传输的最常用的工具,在 Web 中起到的作用不会亚于一直作为 Web 基石的 HTML

(3)XML用途

①把数据从HTML分离;

②简化数据共享;

③简化数据传输;

④简化平台变更;

⑤增强数据可用性,通过 XML,您的数据可供各种阅读设备使用(掌上计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用;

⑥创建新的互联网语言,比如XHTML,用于描述可用的 Web 服务 的 WSDL和作为手持设备的标记语言的 WAP 和 WML

(4)树结构

XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"

(5)语法

<?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>

①XML 声明:

如果存在需要放在文档的第一行,如<?xml version="1.0" encoding="utf-8"?>

②关闭标签:

所有的 XML 元素都必须有一个关闭标签(除了声明外,因为声明不是 XML 文档本身的一部分,所以它没有关闭标签)

③对大小写敏感:

必须使用相同的大小写来编写打开标签和关闭标签

<Message>这是错误的</message>
<message>这是正确的</message>

④必须被正确嵌套;

⑤属性值必须加引号;

⑥实体引用/实体字符:

在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

如果把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始

在 XML 中,有 5 个预定义的实体引用:

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

⑦注释:注释语法与HTML相同,即<!-- -->

⑧保留空格:与HTML裁减空格不同,XML的空格会被保留下来

⑨存储换行:XML 以 LF 存储换行

而在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF);在 Unix 和 Mac OSX 中,使用 LF 来存储新行;在旧的 Mac 系统中,使用 CR 来存储新行

(6)XML元素

①元素构成:

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分,包含文本,属性和其他元素

②元素命名规则:

名称可以包含字母、数字以及其他的字符;不能以数字或者标点符号开始

不能以字母 xml(或者 XML、Xml 等等)开始;不能包含空格

③命名习惯:

名称应具有描述性,使用下划线的名称也很不错:<first_name>、<last_name>;

名称应简短和简单,比如:<book_title>,而不是:<the_title_of_the_book>;

避免 "-" 字符,如果这样进行命名:"first-name",一些软件会认为您想要从 first 里边减去 name;

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

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

④可扩展:

XML 的优势之一,就是可以在不中断应用程序的情况下进行扩展

(7)XML属性

①属性VS元素:

<person date="10/01/2008">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<date>10/01/2008</date>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
    在第一个实例中,sex 是一个属性。在第二个实例中,sex 是一个元素。这两个实例都提供相同的信息。

没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用元素。

    我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用元素吧

    当然也可以使用扩展的data元素:

<person>
<date>
<day>10</day>
<month>01</month>
<year>2008</year>
</date>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
 ②避免使用XML属性

因使用属性而引起的一些问题:

属性不能包含多个值(元素可以);属性不能包含树结构(元素可以);属性不容易扩展(为未来的变化)

属性难以阅读和维护等

所以要尽量使用元素来描述数据,而仅仅使用属性来提供与数据无关的信息

不要做这样的蠢事(这不是 XML 应该被使用的方式):

<note day="10" month="01" year="2008"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>

(8)针对元数据的 XML 属性

有时候会向元素分配 ID 引用,这些 ID 索引可用于标识 XML 元素,它起作用的方式与 HTML 中 id 属性是一样的

【注意】:id 属性仅仅是一个标识符,用于标识不同的便签,它并不是标签数据的组成部分。在此极力传递的理念是:元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素

(9)XML验证

①通过 DTD 验证的XML是"合法"的 XML,DTD 的目的是定义 XML 文档的结构,它使用一系列合法的元素来定义文档结构

具体我在下一篇文章里做了总结

②XML Schema

W3C 支持一种基于 XML 的 DTD 代替者,它名为 XML Schema(架构)

(10)XML验证器

①使用XML验证器来对XML文件进行语法检查

XML文档里的错误会终止您的 XML 应用程序

W3C 的 XML 规范声明:如果 XML 文档存在错误,那么程序就不应当继续处理这个文档。理由是,XML 软件应当轻巧,快速,具有良好的兼容性

 ②还可以根据 DTD 来验证 XML,需要把 DOCTYPE 声明(带有 DTD)添加到XML中 <xml> 元素后

(11)查看XML文件

由于 XML 标签由 XML 文档的作者"发明",浏览器无法确定像 <table> 这样一个标签究竟描述一个 HTML 表格还是一个餐桌。

在没有任何有关如何显示数据的信息的情况下,大多数的浏览器都会仅仅把 XML 文档显示为源代码。

例如:一个简单的食物菜单-------这是一个来自餐馆的早餐菜单,存储为 XML 数据

(12)样式格式化

关于XML样式格式化有两种方式:CSS和XSLT,下面分开讲解

①使用 CSS 显示您的 XML(不常用,W3C 推荐使用 XSLT)

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>

 ②XSLT

XSLT(eXtensible可扩展 Stylesheet样式表 Language Transformations语言转换),在浏览器显示 XML 文件之前,先把它转换为 HTML

可以在浏览器完成转换,但是不同浏览器可能产生不同结果,所以也可以在服务器进行转换

(13)跨域访问

出于安全方面的原因,现代的浏览器不允许跨域的访问。

这意味着,网页以及它试图加载的 XML 文件,都必须位于相同的服务器上

(14)加载XML文件

如需从 XML 文件("note.xml")的 <to> 元素中提取文本 "Tove",语法是:

getElementsByTagName("to")[0].childNodes[0].nodeValue

请注意,即使 XML 文件只包含一个 <to> 元素,您仍然必须指定数组索引 [0]。这是因为 getElementsByTagName() 方法返回一个数组

(15)XML应用实例

在 HTML div 元素中显示第一个 CD

下面的实例从第一个 CD 元素中获取 XML 数据,然后在 id="showCD" 的 HTML 元素中显示数据

displayCD() 函数在页面加载时调用:

<!DOCTYPE html>
<html>
<head>
<script>
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
     xmlhttp=new XMLHttpRequest();
  }else{// code for IE6, IE5
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.open("GET","cd_catalog.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML; 
x=xmlDoc.getElementsByTagName("CD");
i=0;
function displayCD(){
  artist=(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
  title=(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
  year=(x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue);
  txt="Artist: " + artist + "<br>Title: " + title + "<br>Year: "+ year;
  document.getElementById("showCD").innerHTML=txt;
}
</script>
</head>
<body onload="displayCD()">
<div id='showCD'></div>
</body>
</html>

【XML进阶】

(1) 命名冲突

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

①使用前缀来避免命名冲突,例如

<h:table>
<h:td>Apples</h:td>
</h:table>
与
<f:table>
<f:name>African Coffee Table</f:name>
</f:table>

 ②XML 命名空间 - xmlns 属性

当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义,命名空间是在元素的开始标签的 xmlns 属性中定义

 1 . 命名空间声明语法:xmlns:前缀="URI"

<root>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:td>Apples</h:td>
</h:table>
<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
</f:table>
</root>

  2. 默认的命名空间

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

xmlns="namespaceURI"

这个 XML 携带 HTML 表格的信息:

<table xmlns="http://www.w3.org/TR/html4/">
<td>Apples</td>
</table>

  3 . xsl命名空间标识xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

XSLT 是一种用于把 XML 文档转换为其他格式的 XML 语言,比如 HTML。

在下面的 XSLT 文档中,您可以看到,大多数的标签是 HTML 标签。

非 HTML 的标签都有前缀 xsl,并由此命名空间标识:xmlns:xsl="http://www.w3.org/1999/XSL/Transform":

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr>
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

(2)XML的CDATA

CDATA 是不应该由 XML 解析器解析的文本数据

像 "<" 和 "&" 字符在 XML 元素中都是非法的,而某些文本,比如JavaScript代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA,这样CDATA 部分中的所有内容都会被解析器忽略

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

<script>
<![CDATA[
function matchwo(a,b){
if (a < b && a < 0) then{
return 1;
}else{
return 0;
}
}
]]>
</script>

(3)服务器上的 XML

XML 文件是类似 HTML 文件的纯文本文件,能够通过标准的 Web 服务器轻松地存储和生成

【存储】:在服务器上存储 XML 文件

XML 文件在 Internet 服务器上进行存储的方式与 HTML 文件完全相同

用适当的文件名,比如 "note.xml",在 Web 服务器上保存这个文件

【生成】

通过ASP,PHP,数据库都可以

在服务器上通过 XSLT 转换 XML,例如ASP代码在服务器上把 XML 文件转换为 XHTML

(4)XML相关技术

①可扩展超文本标记语言XHTML

②DTD (文档类型定义),定义 XML 文档中的合法元素的标准

③SVG (可伸缩矢量图形) ,定义 XML 格式的图形

【【这里分享个不错的技术文章,简单易懂】】

  XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。

上面这段是对XML的一个基本定义,一个被广泛接受的说明。简单说,XML就是一种数据的描述语言,虽然它是语言,但是通常情况下,它并不具备常见语言的基本功能——被计算机识别并运行。只有依靠另一种语言,来解释它,使它达到你想要的效果或被计算机所接受。

假如你是刚接触XML的新手,那么可能并无法从定义上是了解XML是什么。也许,你可以换个角度来认识XML是什么;从应用面来认识XML,从XML可以做些什么来认识它,这应该能比那更空洞的定义对你更有帮助。

XML应用面主要分为两种类型,文档型和数据型。下面介绍一下几种常见的XML应用:

1、自定义XML+XSLT=>HTML,最常见的文档型应用之一。XML存放整个文档的XML数据,然后XSLT将XML转换、解析,结合XSLT中的HTML标签,最终成为HTML,显示在浏览器上。典型的例子就是CSDN上的帖子。

2、XML作为微型数据库,这是最常见的数据型应用之一。我们利用相关的XML API(MSXML DOM、JAVA DOM等)对XML进行存取和查询。留言板的实现中,就经常可以看到用XML作为数据库。同时,这里要告诉一些新人,数据库和数据库系统,这两个概念是不同的。这里顺便提一下XML对数据库系统的影响。在新版本的传统数据库系统中,XML成为了一种数据类型。和“传统”相对的就是一种新形态的数据库,完全以XML相关技术为基础的数据库系统。目前比较知名的eXist。

3、作为信息传递的载体。为什么说是载体呢?因为这些应用虽然还是以XML为基本形态,但是都已经发展出具有特定意义的格式形态。最典型的就是WEB SERVICE,将数据包装成XML来传递,但是这里的XML已经有了特定的规格,即SOAP。不过这里还不得不说AJAX,AJAX的应用中,相信也有一部分的应用是以自定义XML为数据,不过没有成为工业标准,这里不做详述。

4、应用程序的配置信息数据。最典型的就是J2EE配置WEB服务器时用的web.XML。这个应用估计是很容易理解的了。我们只要将需要的数据存入XML,然后在我们的应用程序运行载入,根据不同的数据,做相应的操作。这里其实和应用2,有点类似,所不同的在于,数据库中的数据变化是个常态,而配置信息往往是较为静态,缺少变化的。

5、其他一些文档的XML格式。如WORD、EXCEL等。

6、保存数据间的映射关系。如Hibernate。

这几种常见应用中,我们还可以根据其应用广泛程度,分为:自定义XML和特定意义XML。在1和2就是属于自定义XML的范畴;3至6则属于特定意义XML,或者说是XML的延伸。

这里介绍的6种应用,基本涵盖了XML的主要用途。总之,XML是一种抽象的语言,它不如传统的程序语言那么具体。要深入的认识它,应该先从它的应用入手,选择一种你需要的用途,然后再学习如何使用。

总结:

①UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码;

②极力传递的理念是:元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素;

相关推荐