XML の基本的な知識と形式要件についてはここでは説明しません
以下は XML の基本の概要です
最初の紹介
http://www.php.cn/
基本
http://www.php.cn/
以下は、XML 属性と検証を含む XML の拡張です
XML 要素は次のとおりです。開始タグ内 HTML と同様の属性が含まれます。
属性は、要素に関する追加情報を提供します。
HTML から、08c069fd51d2c2d81cee4e0f0ed64316 を思い出してください。 「src」属性は、a1f02c36ba31691bcfe87b2722de723b 要素に関する追加情報を提供します。
HTML (および XML) では、属性は要素に関する追加情報を提供します。
<img src="computer.gif"> <a href="demo.asp">
属性は、データの一部ではない情報を提供することがよくあります。次の例では、ファイル タイプはデータとは関係ありませんが、この要素を処理する必要があるソフトウェアにとっては重要です:
<file type="gif">computer.gif</file>
属性値は囲む必要があります引用符で囲みますが、一重引用符と二重引用符も使用できます。たとえば、人の性別である人物タグは次のように書くことができます:
<person sex="female">
または次のように書くこともできます:
<person sex='female'>
注: 属性値自体に二重引用符が含まれている場合は、一重引用符で囲む必要があります。この例のように:
<gangster name='George "Shotgun" Ziegler'>
または、エンティティ参照を使用することもできます:
<gangster name="George "Shotgun" Ziegler">
これらの例を見てください:
<person sex="female">Anna Smith female Anna Smith
最初の例では、性別は属性です。 2 番目の例では、性別が子要素です。どちらの例でも同じ情報が提供されます。
いつ属性を使用するか、いつ子要素を使用するかを指示するルールはありません。私の経験では、HTML では属性を使用すると便利ですが、XML では属性の使用を避ける必要があります。情報がデータによく似ている場合は、子要素を使用します。
次の 3 つの XML ドキュメントには、まったく同じ情報が含まれています:
最初の例は、日付属性を使用します:
<note date="08/08/2008"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
2 番目の例は、日付要素を使用します:
<note> <date>08/08/2008</date> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
3 番目の例は、を使用します拡張日付要素 (これが私のお気に入りです):
<note> <date> <day>08</day> <month>08</month> <year>2008</year> </date> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
属性の使用によって引き起こされるいくつかの問題:
属性には複数の値を含めることはできない(要素は可能)
属性はツリー構造を記述することができない(要素は可能)
属性は展開するのが簡単ではない(将来の変更に備えて)
属性の読み取りと保守は困難です
データを記述するには要素を使用するようにしてください。代わりに、属性を使用してデータに依存しない情報を提供します。
次のような愚かなことはしないでください (これは XML の使用方法ではありません):
<note day="08" month="08" year="2008" to="George" from="John" heading="Reminder" body="Don't forget the meeting!"> </note>
場合によっては、ID 参照が要素に割り当てられます。これらの ID インデックスは、HTML の ID 属性と同じ方法で XML 要素を識別するために使用できます。この例はこれを示しています:
<messages> <note id="501"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don'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の検証
DTD に対して検証された 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't forget the meeting!</body> </note>
<?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'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 に関する概要:
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 程序。
W3C 的 XML 规范声明:如果 XML 文档存在错误,那么程序就不应当继续处理这个文档。理由是,XML 软件应当轻巧,快速,具有良好的兼容性。
如果使用 HTML,创建包含大量错误的文档是有可能的(比如你忘记了结束标签)。其中一个主要的原因是 HTML 浏览器相当臃肿,兼容性也很差,并且它们有自己的方式来确定当发现错误时文档应该显示为什么样子。
使用 XML 时,这种情况不应当存在。
为了帮助您对 XML 进行语法检查,我们创建了一个 XML 验证器。
把您的 XML 粘贴到下面的文本框中,然后点击"验证"按钮来进行语法检查。
只要把 DOCTYPE 声明添加到您的 XML 中,然后点击验证按钮即可:
注释:只有在 Internet Explorer 中,可以根据 DTD 来验证 XML。Firefox, Mozilla, Netscape 以及 Opera 做不到这一点。
如何将XML显示在Html上:
从 XML 文件中加载数据,然后把数据显示为一个 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('Your browser cannot handle this script'); } if (xmlDoc!=null) { xmlDoc.async=false; xmlDoc.load("cd_catalog.xml"); document.write("<table border='1'>"); 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>
检测浏览器,然后使用合适的解析器来加载 XML
创建一个 HTML 表格(c3eabfe0f2ab8a9eadae05ced4d2507b)
使用 getElementsByTagName() 来获得所有 XML 的 CD 节点
针对每个 CD 节点,把 ARTIST 和 TITLE 中的数据显示为表格数据
用 f16b1740fad44fb09bfe928bcc527e08 结束表格
XMLHttpRequest
XMLHttpRequest 对象是开发者的梦想,因为您能够:
在不重新加载页面的情况下更新网页
在页面已加载后从服务器请求数据
在页面已加载后从服务器接收数据
在后台向服务器发送数据
所有现代的浏览器都支持 XMLHttpRequest 对象。
实例:当键入文本时与服务器进行 XML HTTP 通信。
通过一行简单的 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 时,我们才执行代码。
我们的实例在 open() 的第三个参数中使用了 "true"。
该参数规定请求是否异步处理。
True 表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应。
onreadystatechange 事件使代码复杂化了。但是这是在没有得到服务器响应的情况下,防止代码停止的最安全的方法。
通过把该参数设置为 "false",可以省去额外的 onreadystatechange 代码。如果在请求失败时是否执行其余的代码无关紧要,那么可以使用这个参数。
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 文档 (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('Your browser cannot handle this script'); } xmlDoc.async=false; xmlDoc.load("cd_catalog.xml");
在本代码执行后,xmlDoc 成为一个 XML DOM 对象,可由 JavaScript 访问。
以下代码使用来自 XML DOM 对象的数据来填充一个 HTML 表格:
document.write("<table border='1'>"); 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。
XML 数据可以拷贝到任何有能力显示文本的 HTML 元素。
下面的代码为 HTML 文件的 93f0f5c25f18dab9d176bd4f6de5d30e 部分。这段代码从第一个 d15114bf3dc8d8fe2e2887944c735e50 元素中获得 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 数据的 a1862d91ae37e8ab9716d1c936937a12 元素。
<p id='show'></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)!