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 个预定义的实体引用:

实体引用            所要替代                       含义
 &lt;                           <                             小于
 &gt;                          >                             大于
 &amp;                     &                                且
 &apos;                     '                               单引号
 &quot;                      "                               双引号

七、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 浏览器中有效,所以要尽量避免使用。

posted @ 2019-12-31 12:06  scnu-yang  阅读(206)  评论(0编辑  收藏  举报