首頁 > 後端開發 > XML/RSS教程 > 瘋狂XML學習筆記(6)-----------XML拓展

瘋狂XML學習筆記(6)-----------XML拓展

黄舟
發布: 2017-02-21 14:33:47
原創
1673 人瀏覽過

有關XML的基礎知識以及格式要求在這裡就不在贅述

#以下是XML基礎的總結

初識

http://www.php.cn/

基礎

http://www.php.cn/

 

以下是XML的拓展包含XML屬性、驗證

## 


XML 元素可以在開始標籤中包含屬性,類似HTML。

屬性 (Attribute) 提供關於元素的額外資訊。

XML 屬性

從HTML,你會回想起這個: 。 "src" 屬性提供有關 元素的額外資訊。

在 HTML 中(以及在 XML 中),屬性提供有關元素的額外資訊:

<img src="computer.gif">
<a href="demo.asp">
登入後複製

屬性通常提供不屬於資料組成部分的資訊。在下面的例子中,檔案類型與資料無關,但是對需要處理這個元素的軟體來說卻很重要:

<file type="gif">computer.gif</file>
登入後複製

XML 屬性必須加引號

屬性值必須被引號包圍,不過單引號和雙引號都可以使用。例如一個人的性別,person 標籤可以這樣寫:

<person sex="female">
登入後複製

或這樣也可以:

<person sex=&#39;female&#39;>
登入後複製

註解:如果屬性值本身包含雙引號,那麼有必要使用單引號包圍它,就像這個範例:

<gangster name=&#39;George "Shotgun" Ziegler&#39;>
登入後複製

或可以使用實體參考:

<gangster name="George &quot;Shotgun&quot; Ziegler">
登入後複製

#XML 元素vs.屬性

##請看這些例子:

<person sex="female">
  Anna
  Smith
 


  female
  Anna
  Smith
登入後複製

在第一個例子中,sex 是一個屬性。在第二個例子中,sex 則是一個子元素。兩個例子均可提供相同的資訊。

沒有什麼規矩可以告訴我們什麼時候該使用屬性,而什麼時候該使用子元素。我的經驗是在 HTML 中,屬性用起來很便利,但在 XML 中,您應該盡量避免使用屬性。如果資訊感覺起來很像數據,那麼請使用子元素吧。

我最喜歡的方式

下面的三個XML 文件包含完全相同的資訊:

第一個範例中使用了date 屬性:

<note date="08/08/2008">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>
登入後複製

第二個範例中使用了date 元素:

<note>
<date>08/08/2008</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>
登入後複製

第三個範例中使用了擴充的date 元素(這是我的最愛) :

<note>
<date>
  <day>08</day>
  <month>08</month>
  <year>2008</year>
</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>
登入後複製

避免XML 屬性?

因使用屬性而引起的一些問題:

    屬性無法包含多重的值(元素可以)
  • #屬性無法描述樹結構(元素可以)
  • 屬性不易擴展(為未來的變化)
  • 屬性難以閱讀和維護
  • 請盡量使用元素來描述資料。而僅使用屬性來提供與資料無關的資訊。

不要做這樣的蠢事(這不是XML 應該被使用的方式):

<note day="08" month="08" year="2008"
to="George" from="John" heading="Reminder" 
body="Don&#39;t forget the meeting!">
</note>
登入後複製

針對元資料的XML 屬性

有時候會分配ID 參考給元素。這些 ID 索引可用於識別 XML 元素,它運作的方式與 HTML 中 ID 屬性是一樣的。這個例子向我們演示了這種情況:

<messages>
  <note id="501">
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don&#39;t forget the meeting!</body>
  </note>
  <note id="502">
    <to>John</to>
    <from>George</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note> 
</messages>
登入後複製

上面的 ID 只是一個標識符,用於標識不同的便簽。它並不是便籤資料的組成部分。

在此我們極力向您傳遞的理念是:元資料(有關資料的資料)應儲存為屬性,而資料本身應儲存為元素。

 

XML驗證

 


擁有正確語法的XML 被稱為「形式良好」的XML。

透過某個 DTD 進行了驗證的 XML 是「合法」的 XML。

形式良好的 XML 文件

一個"形式良好"的 XML 文件擁有正確的語法。

一個"形式良好"的XML 文件會遵守前幾章介紹過的XML 語法規則:

    XML 文件必須有根元素
  • XML 文件必須有關閉標籤
  • XML 標籤對大小寫敏感
  • XML 元素必須正確的巢狀
  • XML 屬性必須加引號
  • #
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don&#39;t forget the meeting!</body>
    </note>
    登入後複製

驗證XML 文件

一個合法的XML 文檔是"形式良好"的XML 文檔,同樣遵守文檔類型定義(DTD) 的語法規則:

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE note SYSTEM "Note.dtd"><note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>
登入後複製

在上例中,DOCTYPE 聲明是對外部DTD 文件的引用。下面的段落展示了這個文件的內容。

XML DTD

DTD 的功能是定義 XML 文件的結構。它使用一系列合法的元素來定義文件結構:

<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
登入後複製

 

有關DTD的總結:

http://www.php.cn/

XML Schema

 

<xs:element name="note">

<xs:complexType>
  <xs:sequence>
    <xs:element name="to"      type="xs:string"/>
    <xs:element name="from"    type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body"    type="xs:string"/>
  </xs:sequence>
</xs:complexType>

</xs:element>
登入後複製

 

一個通用的驗證器

XML 错误会终止您的程序

XML 文档中的错误会终止你的 XML 程序。

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

如果使用 HTML,创建包含大量错误的文档是有可能的(比如你忘记了结束标签)。其中一个主要的原因是 HTML 浏览器相当臃肿,兼容性也很差,并且它们有自己的方式来确定当发现错误时文档应该显示为什么样子。

使用 XML 时,这种情况不应当存在。

对您的 XML 进行语法检查 - 仅用于 IE 浏览器

为了帮助您对 XML 进行语法检查,我们创建了一个 XML 验证器。

把您的 XML 粘贴到下面的文本框中,然后点击"验证"按钮来进行语法检查。

根据 DTD 来验证 XML

只要把 DOCTYPE 声明添加到您的 XML 中,然后点击验证按钮即可:

注释:只有在 Internet Explorer 中,可以根据 DTD 来验证 XML。Firefox, Mozilla, Netscape 以及 Opera 做不到这一点。

如何将XML显示在Html上:

实例

  • 从 XML 文件中加载数据,然后把数据显示为一个 HTML 表格

在 HTML 中显示数据

在上一节中,我们讲解了如何通过 JavaScript 来解析 XML 并访问 DOM。

本例遍历一个 XML 文件 (cd_catalog.xml),然后把每个 CD 元素显示为一个 HTML 表格行:

<html>
<body>

<script type="text/javascript">
var xmlDoc=null;
if (window.ActiveXObject)
{// code for IExmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
else if (document.implementation.createDocument)
{// code for Mozilla, Firefox, Opera, etc.xmlDoc=document.implementation.createDocument("","",null);
}
else
{
alert(&#39;Your browser cannot handle this script&#39;);
}
if (xmlDoc!=null)
{
xmlDoc.async=false;
xmlDoc.load("cd_catalog.xml");

document.write("<table border=&#39;1&#39;>");

var x=xmlDoc.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
{ 
document.write("<tr>");
document.write("<td>");
document.write(
x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td>");

document.write("<td>");
document.write(
x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("</tr>");
}
document.write("</table>");
}
</script>

</body>
</html>
登入後複製

例子解释:

  1. 检测浏览器,然后使用合适的解析器来加载 XML

  2. 创建一个 HTML 表格(

  3. 使用 getElementsByTagName() 来获得所有 XML 的 CD 节点

  4. 针对每个 CD 节点,把 ARTIST 和 TITLE 中的数据显示为表格数据

  5. 结束表格

XMLHttpRequest

什么是 XMLHttpRequest 对象?

XMLHttpRequest 对象是开发者的梦想,因为您能够:

  • 在不重新加载页面的情况下更新网页

  • 在页面已加载后从服务器请求数据

  • 在页面已加载后从服务器接收数据

  • 在后台向服务器发送数据

所有现代的浏览器都支持 XMLHttpRequest 对象。

实例:当键入文本时与服务器进行 XML HTTP 通信

创建 XMLHttpRequest 对象

通过一行简单的 JavaScript 代码,我们就可以创建 XMLHttpRequest 对象。

在所有现代浏览器中(包括 IE 7):

xmlhttp=new XMLHttpRequest()
登入後複製

在 Internet Explorer 5 和 6 中:

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
登入後複製

实例

登入後複製

TIY

注释:onreadystatechange 是一个事件句柄。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数。状态从 0 (uninitialized) 到 4 (complete) 进行变化。仅在状态为 4 时,我们才执行代码。

为什么使用 Async=true ?

我们的实例在 open() 的第三个参数中使用了 "true"。

该参数规定请求是否异步处理。

True 表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应。

onreadystatechange 事件使代码复杂化了。但是这是在没有得到服务器响应的情况下,防止代码停止的最安全的方法。

通过把该参数设置为 "false",可以省去额外的 onreadystatechange 代码。如果在请求失败时是否执行其余的代码无关紧要,那么可以使用这个参数。

XML实例:

XML 文档实例

请看下面这个 XML 文档 ( "cd_catalog.xml" ),它描述了一个 CD 目录:

<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
.
.
... more ...
.
登入後複製

加载 XML 文档

为了加载 XML 文档 (cd_catalog.xml),我们使用了与 XML 解析器那一节中相同的代码:

var xmlDoc;
if (window.ActiveXObject)
  {  // code for IE
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
else if (document.implementation.createDocument)
  {  // code for Firefox, Mozilla, Opera, etc.
  xmlDoc=document.implementation.createDocument("","",null);
  }
else
  {
  alert(&#39;Your browser cannot handle this script&#39;);
  }
xmlDoc.async=false;
xmlDoc.load("cd_catalog.xml");
登入後複製

在本代码执行后,xmlDoc 成为一个 XML DOM 对象,可由 JavaScript 访问。

把 XML 数据显示为 HTML 表格

以下代码使用来自 XML DOM 对象的数据来填充一个 HTML 表格:

document.write("<table border=&#39;1&#39;>");

var x=xmlDoc.getElementsByTagName("CD");
for (var i=0;i<x.length;i++)
{ 
document.write("<tr>");
document.write("<td>");
document.write(
x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td>");

document.write("<td>");
document.write(
x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("</tr>");
}
document.write("</table>");
登入後複製

针对 XML 文档中的每个 CD 元素,会创建一个表格行。每个表格行包含两个表格数据单元,其中的数据来自当前 CD 元素的 ARTIST 和 TITLE。

在任意 HTML 元素中显示 XML 数据

XML 数据可以拷贝到任何有能力显示文本的 HTML 元素。

下面的代码为 HTML 文件的 部分。这段代码从第一个 元素中获得 XML 数据,然后在 id="show" 的 HTML 元素中显示数据:

var x=xmlDoc.getElementsByTagName("CD");
i=0;

function display()
{
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("show").innerHTML=txt;
}
登入後複製

HTML 的 body 元素包含一个 onload 事件属性,它的作用是在页面已经加载时调用 display() 函数。body 元素中还包含了供接受 XML 数据的

元素。

<p id=&#39;show&#39;></p>

</body>
登入後複製

通过上例,你只能看到来自 XML 文档中第一个 CD 元素中的数据。为了导航到数据的下一行,必须添加更多的代码。

添加导航脚本

为了向上例添加导航(功能),需要创建 next() 和 previous() 两个函数:

function next()
{
if (i<x.length-1)
  {
  i++;
  display();
  }
}

function previous()
{
if (i>0)
  {
  i--;
  display();
  }
}
登入後複製

next() 函数确保已到达最后一个 CD 元素后不显示任何东西,previous () 函数确保已到达第一个 CD 元素后不显示任何东西。

通过点击 next/previous 按钮来调用 next() 和 previous() 函数:

<input type="button" onclick="previous()" value="previous" />
<input type="button" onclick="next()" value="next" />
登入後複製

 

以上就是疯狂XML学习笔记(6)-----------XML拓展的内容,更多相关内容请关注PHP中文网(www.php.cn)!

 

 

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板