1. 程式人生 > >XML/DTD基本用法 DTD禁用的解決方法

XML/DTD基本用法 DTD禁用的解決方法


 DEMO,載入XML並使用(XML大小寫敏感,每種瀏覽器載入XML的方式有所不同,所以在此之前需要寫一個判斷各種瀏覽器的function,根據不同瀏覽器使用不同的載入方法)
判斷方法如下:


var xmlFileName="xxFile.xml";  
var xmlDoc='';  
if (window.ActiveXObject){ // IE     
    var activeXNameList=new Array("MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XMLDOM","MSXML.DOMDocument");  //這裡是XML版本的使用,如果有,使用最新版本
    for(var h=0;h<activeXNameList.length;h++)  
    {  
        try{  
            xmlDoc=new ActiveXObject(activeXNameList[h]);  
        }catch(e){  
            continue;  
        }  
        if(xmlDoc) break;     
    }  
}else if(document.implementation && document.implementation.createDocument){ //非 IE  
    xmlDoc=document.implementation.createDocument("","",null);    
}else{  
    alert('can not create XML DOM object, update your browser please...');  
}  
xmlDoc.async=false;  //同步,防止後面程式處理時遇到檔案還沒載入完成出現的錯誤,故同步等XML檔案載入完再做後面處理  
xmlDoc.load(xmlFileName); //載入XML  






載入完成後,可以讀取XML的元素,如下操作:




XML檔案:


<?xml version="1.0" encoding="GB2312"?>
<USER>
<NAME>XXX
</NAME>
<age>21
</age>
<PHONE>
1353502xxxx
</PHONE>
</USER>




//讀取XML內容,XML元素可以擁有屬性,因此也可以獲取屬性


var nodeList= xmlDoc.getElementsByTagName("age"); // IE     //通過getElementByTagName獲取到的標籤均為一個數組,如果該標籤只有一個
一樣要寫成陣列【0】的形式,文字內容屬於文字節點,因此還需要childNodes[0]的形式獲取,接下來才是‘文字節點’的值。
document.write(nodeList[0].childNodes[0].nodeValue);



如果是要獲取“USER”這個標籤,並顯示 "age"則應該是這樣寫

var doc=xmlDoc.getElementsByTagName("USER");
   document.write(doc[0].getElementsByTagName("age")[0].childNodes[0].nodeValue);
   
   //獲取NAME 元素的 name屬性 document.write(doc[0].getElementsByTagName("NAME")[0].getAttribute("name"));
   
   注意:XML檔案定義中除了版本號以外,編碼格式也尤其重要,本例子中使用的是GB2312型別,所以用nodepad的時候要用ANSI格式編碼,如果發現輸出的內容為空有可能是編碼格式和XML中定義的格式不一致導致的,例如將encoding改為utf-8  則需要用NODEPADED++將XML檔案轉為UTF8模式,否則輸出為空.
   
   
   
   ===========================================================
   
   DTD  文件定義規範,*該解釋來源網路(以下兩種方式都可能提示  DTD 禁用的情況,往下有講解

   
  1: 
   內部的 DOCTYPE 宣告
假如 DTD 被包含在您的 XML 原始檔中,它應當通過下面的語法包裝在一個 DOCTYPE 宣告中:
<!DOCTYPE 根元素 [元素宣告]>
帶有 DTD 的 XML 文件例項(請在 IE5 以及更高的版本開啟,並選擇檢視原始碼):
<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>//括號裡面表示note元素又包含了這4個子元素
  <!ELEMENT to      (#PCDATA)>//括號裡表示的是該元素為字元資料
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>




2: 
外部文件宣告
假如 DTD 位於 XML 原始檔的外部,那麼它應通過下面的語法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE 根元素 SYSTEM "檔名">
這個 XML 文件和上面的 XML 文件相同,但是擁有一個外部的 DTD: (在 IE5 中開啟,並選擇“檢視原始碼”命令。)
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 
這是包含 DTD 的 "note.dtd" 檔案:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>








為什麼使用 DTD?
通過 DTD,您的每一個 XML 檔案均可攜帶一個有關其自身格式的描述。
通過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換資料。
而您的應用程式也可使用某個標準的 DTD 來驗證從外部接收到的資料。
您還可以使用 DTD 來驗證您自身的資料。
  
  
在驗證之前先載入,檢視是否出錯


xmlDoc.validateOnParse="true";//DTD驗證   --如果在未載入資料之前可以提取XML內容,載入DTD之後不行,下面的輸出語句中提示DTD輸出錯誤。

xmlDoc.load(xmlFileName); //載入XML  
document.write("<br>Error Code: ");
document.write(xmlDoc.parseError.errorCode);
document.write("<br>Error Reason: ");
document.write(xmlDoc.parseError.reason);
document.write("<br>Error Line: ");

document.write(xmlDoc.parseError.line);  

關於上面提到的,內部以及外部文件說明引入會提示DTD禁用的問題,我記得網上查詢資料都是說IE設定問題,但事實上根據他們說的修改了設定也並沒有用。

所以我想一般我們在寫HTML時候都會引入W3C的一個標準,所以把內部和外部文件引入的程式碼寫到了需要呼叫XML資料的HTML頁面,而不是寫在XML裡面。


我的解決方法是:不在XML檔案中定義外部(內部)DTD,而是在呼叫XML的 HTML(VIEW)頁面載入  <!DOCTYPE note SYSTEM "note.dtd">,因為一般情況下呼叫的是公用的DTD檔案,而自己寫的實際上也可以放在檔案開頭,SYSTEM表示私有的DTD檔案而並非公用的(如下):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
將DTD定義放到HTML頂部則可以解決這個問題!!