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

21 篇文章 0 订阅
0 篇文章 0 订阅

 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顶部则可以解决这个问题!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值