XML(可扩展标记语言)被设计用来传输和存储数据;
HTML(超文本标记语言) 被设计用来显示数据。
DOM2级是首先提出 动态创建XML DOM概念的规范。
【创建XML文档】
document.implementation.createDocument("","root",null);
第一个参数为命名空间,第二个参数为XML文档元素的标签名,第三个参数是文档类型。
document.implementation返回处理该文档的 DOMImplementation 对象,
DomImplementation 对象可执行与文档对象模型的任何实例无关的任何操作。
【解析XML文档成DOM结构】
1. 创建DOMParser实例
2. 调用parseFromString(XML字符串,"text/xml")方法,该方法返回一个Document对象
var parser = new DOMParser();
var xmldom = parser.parseFromString("<root><child/></root>","text/xml");
当发生解析错误时,parseFromString方法会返回一个<parsererror>
元素,元素内容是对错误的描述。
【将DOM文档序列化为XML字符串】
1. 创建XMLSerializer实例
2. 调用serializeToString(xmldom)
var serializer = new XMLSerializer();
var xml = serializer.serializeToString(xmldom);
【IE8及更早版本的XML】通过ActiveX对象实现
1.【创建XML文档】
通过创建ActiveXObject类型来创建XML文档实例 : new ActiveXObject()
function createDocument(){
if(typeof arguments.callee.activeXString != "string"){
//XML文档版本
var version = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"],
i,
len;
for(i=0,len=version.length;i<len;i++){
try{
new ActiveXObject(version[i]);
arguments.callee.activeXString = version[i];
//如果版本有效,将可用版本直接保存在activeXString属性中。
break;
}catch(ex){
continue;
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
}
2.【解析XML字符串】
(1)创建DOM文档
(2)调用loadXML(xml字符串)方法
var xmldom = createDocument();
xmldom.loadXML("<root><child/></root>");
当发生解析错误时,可以在parseError属性中找到错误信息。
parseError属性包含一系列属性:
另外,parseError的valueof()方法返回errorCode的值。
3.【序列化XML】
IE将序列化XML的能力内置在DOM文档中,为每个DOM节点提供了xml属性,保存着节点的XML字符串。
xmldom.xml;
4.【加载XML】
加载文档的方式有”同步”和”异步”两种,通过async属性设置,true为异步;false为同步。
确定完加载方式后,调用load()可以启动下载过程。(注意:不是loadXML())
在异步加载XML文件的情况下,还需要在调用load()之前给onreadystatechange事件指定事件处理程序。
var xmldom = createDocument();
xmldom.async = true; //异步加载
xmldom.onreadystatechange = function(){
//当XML文件全部加载完并且解析为DOM文档时,就绪状态readyState为4
if(xmldom.readyState == 4){
if(xmldom.parseError.valueOf() !=0){
console.log("发生解析错误:\n错误类型数值编码:"+xmldom.parseError.errorCode+
"\n发生错误的行:"+xmldom.parseError.line+"\n发生错误的行中字符"+xmldom.parseError.linepos+
"\n发生错误的脚本解释:"+xmldom.parseError.reason);
}
else{
//处理xml文档
}
}
};
xmldom.load("xml文件");
【跨浏览器解析XML】
function parseXml(xml){
if(typeof DOMParser != "undefined"){
var xmldom = (new DOMParser()).parseFromString(xml,"text/xml");
var errors = xmldom.getElementsByTagName("parsererror");
if(errors.length){
throw new Error("XML解析错误:"+errors[0].textContent);
}
}else if(typeof ActiveXObject != "undefined"){
var xmldom = createDocument();
xmldom.load(xml);
if(xmldom.parseError.valueOf() !=0){
throw new Error("XML解析错误:"+xmldom.parseError.reason);
}
}else{
throw new Error("无法解析XML");
}
}
在使用该parseXML函数解析XML时,应该把XML放在try-catch语句中,以防发生错误。
var xmldom = null;
try{
xmldom = parseXml("<root><child/></root>");
//进一步处理
}catch(ex){
console.log(ex.message);
}
【跨浏览器序列化XML】
function serializeXML(xmldom){
if(typeof XMLSerializer != "undefined"){
return (new XMLSerializer()).serializeToString(xmldom);
}else if(typeof xmldom.xml != 'undefined'){
return xmldom.xml;
}else{
throw new Error("无法序列化为XML");
}
}
var xml = serializeXML(xmldom);