XML的学习
一、概念:XML(EXtensible Markup Language):可扩展标记语言
二、作用(跟HTML的区别):XML:被设计用来结构化,用来传输和存储数据(HTML:用来显示数据。两者的侧重点都不一样。)
举个例子:
<?xml version="1.0" encoding="UTF-8"?>#XML声明,可选(不是XML文档本身的一部分),若存在的话则需要放在第一行。
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
上面这条便签具有自我描述性,它包含了发送者和接受者的信息,同时拥有标题以及消息主体。但是这个XML文档仍然没有做任何事情,该note只是包装在XML标签中的纯粹信息,我们需要编写软件或者程序,才能传送,接收和显示出这个文档。
三、XML标签:
1)XML标签没有被预定义,需要自行定义标签。
2)所有的XML元素都必须有一个关闭标签(XML声明不是XML文档本身的一部分)。这个跟HTML有点不一样,HTML中有些标签是不用闭标签的,如<p>。
3)XML 标签对大小写敏感,必须使用相同的大小写来编写打开标签和关闭标签。
四、XML树结构:
1)指的是标签之间的外层内层关系。
2)XML文档必须有根元素(根标签):所有其他元素的父元素。
3)XML 元素指的是从开始标签直到结束标签的部分(包括起终标签)。
五、XML属性:
1)XML元素的属性值必须加单/双引号:格式:<元素名 属性名1="属性值1">。如果属性值本身包含双引号,则用单引号,相反则反。
2)特定的属性名称在同一个元素标记中只能出现一次。
3)属性难以阅读和维护,应该尽量使用元素来描述数据,而仅仅使用属性来提供与数据无关的信息。
六、XML实体引用:如果把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。所以才会有XML实体引用:
在 XML 中,有 5 个预定义的实体引用:
实体引用 所要替代 含义
< < 小于
> > 大于
& & 且
' ' 单引号
" " 双引号
七、XML注释:<!-- -->
八、XML元素的命名规则:
1)名称可以包含字母,数字以及其他字符;
2)名称不能以数字或者标点符号开始;
3)名称不能以字母XML开始;
4)名称不能包含空格。
5)可使用任何名称,没有保留字词。
6)建议:起具有描述性,简短的(下划线连接),避免’-‘’.‘’:‘这类字符的使用,很可能会直接造成别的歧义。
九、空格与换行:
1)HTML的空格问题:HTML中会把多个连续的空格字符裁减(合并)为一个。但是XML中,文档的空格不会被删减。
2)换行:XML以LF存储换行。
十、XMLHttpRequest
1、XMLHttpRequest 对象用于在后台与服务器交换数据。
2、XMLHttpRequest对象的优点:
1)在不重新加载页面的情况下更新网页
2)在页面已加载后从服务器请求数据
3)在页面已加载后从服务器接收数据
4)在后台向服务器发送数据
3、创建XMLHttpRequest对象的语法:xmlhttp=new XMLHttpRequest();
十一、XML解析器:XML 解析器把 XML 文档转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象。
十二、XSLT样式表语言:
1、XML首选XSLT样式表语言显示XML,因为:
1)XSLT(eXtensible Stylesheet Language Transformations)远比 CSS 更加完善。
2)XSLT是在浏览器显示XML文件之前,先把它转换为 HTML:当浏览器读取XML文件时,XSLT 转换(可在服务器上完成)是由浏览器完成的。
十三、使用CSS格式化XML:
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>#这个一般是跟在XML声明的后面,也就是第二行。其中cd_catalog.css文件是预先写好的css文件。
十四、DOCTYPE声明对外部DTD文件的引用:<!DOCTYPE note SYSTEM "Note.dtd">
十五、XML DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法。
1)使用getElementsByTagName()方法从XML文档中取回数据。
如获取元素值:检索第一个<title>元素的文本值:【假设实例使用的是books.xml】
txt=xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;#元素的文本值都是一份,不存在元素的第几个子节点的文本值说法
2)获取属性值:检索第一个 <title> 元素的 "lang" 属性的文本值:
txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");
3)改变元素的值:改变第一个 <title> 元素的文本值:
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];#获得该元素
x.nodeValue="Easy Cooking";#将该元素的文本值属性更改。
4)创建新的属性:创建一个新的属性(edition="first"),然后把它添加到每一个 <book> 元素中:
x=xmlDoc.getElementsByTagName("book");#获得xml文件中的所有book元素。
for(i=0;i<x.length;i++)
{
x[i].setAttribute("edition","first");#setAttribute()方法可用于改变现有的属性值,或创建一个新的属性
}
5)创建新的元素:createElement()方法用于创建一个新的元素节点。createTextNode()方法用于创建一个新的文本节点。appendChild() 方法用于向节点添加子节点(在最后一个子节点之后)。如需创建带有文本内容的新元素,需要同时创建元一个新的元素节点和一个新的文本节点,然后把他追加到现有的节点。
如:创建了一个新的元素(<edition>),带有如下文本:First,然后把它添加到第一个 <book> 元素:
newel=xmlDoc.createElement("edition");#创建一个 <edition> 元素
newtext=xmlDoc.createTextNode("First");#创建值为 "First" 的文本节点newtext
newel.appendChild(newtext);向元素节点<edition>添文本节点内容First
x=xmlDoc.getElementsByTagName("book");#从XML文件中获取book元素
x[0].appendChild(newel);#将<edition>节点添加为第一个book元素的子元素。
6)删除元素:如删除第一个 <book> 元素的第一个节点:
x=xmlDoc.getElementsByTagName("book")[0];
x.removeChild(x.childNodes[0]);
十六、XML文档实例:在HTML div元素中显示 "cd_catalog.xml" 文件(此处默认已经写好,并放置相应的目录上)的第一个CD
<!DOCTYPE html>
<html>
<head>
<script>
#把 XML 文档解析到 XML DOM 对象中(可通过 JavaScript 操作的对象)。不同浏览器创建XMLHttpRequest对象的方式不同
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
#建一个新的http请求,建立与服务器的连接,并指定此请求的方法:GET、URL(可以是绝对地址也可以是相对地址)、false(可选参数):指定该请求不是异步方式。默认为异步方式true。
xmlhttp.open("GET","cd_catalog.xml",false);
#Get是向服务器发索取数据的一种请求(用于获取/查询资源信息),而Post是向服务器提交数据的一种请求(用于更新资源信息)
xmlhttp.send();#建立了连接就发送请求。这里涉及到'GET'、'POST'的区别,如果是'POST'的话,就写成:xmlhttp.send(url)
#返回一个包含请求检索的HTML或XML的Document,如果请求未成功,尚未发送,或者检索的数据无法正确解析为XML或HTML,则为null。简单点说:就是说拿到了所请求的文档。
xmlDoc=xmlhttp.responseXML;
x=xmlDoc.getElementsByTagName("CD");#获得该文档中的所有元素名为"CD"的部分。
i=0;#这个编号是记录对应所请求到的文档的第几个"CD"元素
function displayCD()
{
#getElementsByTagName():返回的是一个数组,所以必须指定数组索引为[0]。下面这语句表示:获取第一个<ARTIST>元素的文本值
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(" ") 得到的是一个对象。innerHTML在JS是双向功能:获取对象的内容 或 向对象插入内容:
#下面意思是:获取id为showCD的对象的内嵌内容,或者说是:向id为showCD的对象插入内容txt。
document.getElementById("showCD").innerHTML=txt;
}
#导航功能函数
function next()
{
if (i<x.length-1){
i++; displayCD();
}
}
function previous()
{
if (i>0){
i--; displayCD();
}
}
</script>
</head>
<body onload="displayCD()">#onload事件:在页面载入完成后立即触发,displayCD()就是事件发生后指定的要执行的JavaScript。
<div id='showCD'></div><br>
<input type="button" onclick="previous()" value="<<" />
<input type="button" onclick="next()" value=">>" />
</body>
</html>
十七、XML命名空间:提供了一种避免元素命名冲突的方法:可以使用前缀来解决。使用前缀,必须得定义用于前缀的命名空间:命名空间是在元素的开始标签的xmlns属性中定义的,语法为:xmlns:前缀="url"。举个例子:
<h:table xmlns:h="http://www.w3.org/TR/html4/"> (命名空间的URI不会被解析器用于查找信息。)
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。另外,命名空间,可以在他们被使用的元素中或者在 XML 根元素中声明。
十八、解析字符数据(PCDATA)和未解析字符数据CDATA:
1、解析字符数据(PCDATA):XML解析器通常会解析XML文档中所有的文本。(当某个 XML 元素被解析时,其标签之间的文本也会被解析)
2、CDATA:未解析字符数据:该部分的文本会被解析器忽略。
1)CDATA块的作用:可以避免解析器将一些'在XML元素中是非法的字符,如'<''&'等'直接解析,影响本身所要表达的内容。例如一个JavaScript代码中就包含着许多XML元素非法字符'<''&'之类的,为了避免解析错误,可以直接将脚本代码定义为CDATA:
CDATA部分由 "<![CDATA[" 开始,由 "]]>" 结束,CDATA 部分中的所有内容都会被解析器忽略。如:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{return 1;}
else
{return 0;}
}
]]>
</script>
2)注意:CDATA部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。标记 CDATA 部分结尾的 "]]>" 不能包含空格或换行。
十九、XML 数据岛:XML数据岛是嵌入到 HTML 页面中的 XML 数据。只是在 Internet Explorer 浏览器中有效,所以要尽量避免使用。