什么是 XML?
- XML 指可擴展標記語言(EXtensible Markup Language)
- XML 是一種標記語言,很類似 HTML
- XML 的設計宗旨是傳輸數據,而非顯示數據
- XML 標簽沒有被預定義。您需要自行定義標簽。
- XML 被設計為具有自我描述性。
- XML 是 W3C 的推薦標准
XML DOM
加載並解析 XML 文件
JS代碼:
var xmlhttp,xmlDoc; if(window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); }else{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open('get','./http.xml',false); xmlhttp.send(); xmlDoc = xmlhttp.responseXML; document.getElementById('to').innerHTML = xmlDoc.getElementsByTagName('to')[0].childNodes[0].nodeValue;
http.xml代碼:
<note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
詳細了解: XMLHttpRequest 對象
加載並解析 XML 字符串
<body> <h1>W3School.com.cn Internal Note</h1> <p> <b>To:</b> <span id="to"></span><br /> <b>From:</b> <span id="from"></span><br /> <b>Message:</b> <span id="message"></span> </p> <script type="text/javascript"> var txt = ` <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> `; <!-- txt="<note>"; txt=txt+"<to>George</to>"; txt=txt+"<from>John</from>"; txt=txt+"<heading>Reminder</heading>"; txt=txt+"<body>Don't forget the meeting!</body>"; txt=txt+"</note>"; --> if (window.DOMParser){ parser=new DOMParser(); xmlDoc=parser.parseFromString(txt,"text/xml"); } else{ // Internet Explorer xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.loadXML(txt); } document.getElementById("to").innerHTML=xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue; document.getElementById("from").innerHTML=xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue; document.getElementById("message").innerHTML=xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;
XML to HTML
HTML代碼 :
<body> <script type="text/javascript"> 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","./http.xml",false); xmlhttp.send(); xmlDoc=xmlhttp.responseXML; document.write("<table border='1'>"); var x=xmlDoc.getElementsByTagName("block"); for (i=0;i<x.length;i++){ document.write("<tr><td>"); document.write(x[i].getElementsByTagName("to")[0].childNodes[0].nodeValue); document.write("</td><td>"); document.write(x[i].getElementsByTagName("from")[0].childNodes[0].nodeValue); document.write("</td></tr>"); } document.write("</table>"); </script> </body>
http.xml代碼:
<note> <block> <to>George</to> <from>John</from> </block> <block> <to>China</to> <from>America</from> </block> </note>
注意:出於安全方面的原因,現代的瀏覽器不允許跨域的訪問。假如你打算在自己的網頁上使用上面的例子,則必須把 XML 文件放到自己的服務器上。否則,
xmlDoc.load()
將產生錯誤 "Access is denied"。
XML 命名空間(XML Namespaces)
使用前綴來避免命名沖突
此文檔帶有某個表格中的信息:
<h:table> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
此 XML 文檔攜帶着有關一件家具的信息:
<f:table> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
現在,命名沖突不存在了,這是由於兩個文檔都使用了不同的名稱來命名它們的<table>
元素 (<h:table> 和 <f:table>)
。
通過使用前綴,我們創建了兩種不同類型的 <table>
元素。
使用命名空間(Namespaces)
這個 XML 文檔攜帶着某個表格中的信息:
<h:table xmlns:h="http://www.w3.org/TR/html4/"> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
此 XML 文檔攜帶着有關一件家具的信息:
<f:table xmlns:f="http://www.w3school.com.cn/furniture"> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
與僅僅使用前綴不同,我們為<table>
標簽添加了一個xmlns
屬性,這樣就為前綴賦予了一個與某個命名空間相關聯的限定名稱。
(xmlns) 屬性
XML 命名空間屬性被放置於元素的開始標簽之中,並使用以下的語法:
xmlns:namespace-prefix="namespaceURI"
XML CDATA
非法的 XML 字符必須被替換為實體引用
假如您在 XML 文檔中放置了一個類似 "<"
字符,那么這個文檔會產生一個錯誤,這是因為解析器會把它解釋為新元素的開始。因此你不能這樣寫:
<message>if salary < 1000 then</message>
為了避免此類錯誤,需要把字符"<"
替換為實體引用,就像這樣:
<message>if salary < 1000 then</message>
在 XML 中有 5 個預定義的實體引用:
< | < | 小於 |
> | > | 大於 |
& | & | 和號 |
' | ' | 省略號 |
" | " | 引號 |
注釋:嚴格地講,在 XML 中僅有字符 "<"和"&" 是非法的。省略號、引號和大於號是合法的,但是把它們替換為實體引用是個好的習慣。
CDATA
在 XML 元素中,"<" 和 "&" 是非法的。
"<" 會產生錯誤,因為解析器會把該字符解釋為新元素的開始。
"&" 也會產生錯誤,因為解析器會把該字符解釋為字符實體的開始。
某些文本,比如 JavaScript 代碼,包含大量 "<" 或 "&" 字符。為了避免錯誤,可以將腳本代碼定義為 CDATA。
CDATA 部分中的所有內容都會被解析器忽略。
CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結束:
<script> <![CDATA[ function matchwo(a,b) { if (a < b && a < 0) then { return 1; } else { return 0; } } ]]> </script>
詳細參考:《XML CDATA》
詳細的基礎知識參考:《W3school:XML 教程》