WEB前端需要了解的XML相關基礎知識


什么是 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 命名空間(XML Namespaces)

XML CDATA

非法的 XML 字符必須被替換為實體引用

假如您在 XML 文檔中放置了一個類似 "<" 字符,那么這個文檔會產生一個錯誤,這是因為解析器會把它解釋為新元素的開始。因此你不能這樣寫:

<message>if salary < 1000 then</message>

為了避免此類錯誤,需要把字符"<" 替換為實體引用,就像這樣:

<message>if salary &lt; 1000 then</message>

在 XML 中有 5 個預定義的實體引用:

&lt; < 小於
&gt; > 大於
&amp; & 和號
&apos; ' 省略號
&quot; " 引號

注釋:嚴格地講,在 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 教程》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM