④domConfig为DOMConfiguration类型的实例,表示针对特定文档的解析和格式化规则。LSParser会用此对象指定额外配置信息,需调用setParameter()方法。其中一个参数是"error_handler",用于指定处理解析错误的函数。
var implementation = document.implementation;
var parser = implementation.createLSParser(implementation.MODE_ASYNCHROUNS,null);
var input = implementation.createLSInput();
input.stringData = "<root>";
//预订load事件,但不会触发load事件
parser.addEventListener("load",function(event){
var xmldom = event.newDocument;
var input = event.input;
alert(xmldom.documentElement.tagName); //"root"
alert(xmldom.documentElement.firstChild.tagName); //"child"
var anotherChild = xmldom.createElement("child");
xmldom.documentElement.appendChild(anotherChild);
var children = xmldom.getElementsByTagName("child");
alert(children.length); //2
},false);
parser.domConfig.setParameter("error_handler",fucntion(ex){
alert("Parsing error!");
});
//开始解析
parser.parse(input);
1.4.2 其它解析方式
通过LSParser还可以执行两种类型的解析:解析来自URI的文件和基于上下文解析。
(1)解析来自URI的XML。
①不用创建LSInput。
②开始解析时调用parseURI()方法,并为其传入一个指向有效XML的URI。Parser.parseURI("example.xml");
(2)基于上下文解析
①首先解析字符串,然后将解析结果插入另一个文档。
②使用parseWithContext()方法接受3个参数:LSInput对象、上下文节点和要执行的操作。
□LSInput对象的stringData属性中必须包含XML片段的代码,不能含有XML序言内容(prolog)。
□上下文节点是解析完的片段该插入的地方。
□要执行的操作必须是下列LSParser常量之一。
◇ACTION_APPEND_AS_CHILDERN:将解析结果作为子节点添加到上下文节点中。
◇ACTION_REPLACE_CHILDREN:先移除上下文节点的所有节点,然后将解析结果作为上下文节点的子节点插入。
◇ACTION_INSERT_BEFORE:将解析结果作为上下文节点的同辈节点,插入到上下文节点前面。
◇ACTION_INSERT_AFTER:将解析结果作为上下文节点的同辈节点,插入到上下文节点后面。
◇ACTION_REPLACE:用解析结果替换上下文节点。
◇在解析错误时,以上操作均会被取消。
var implementation = document.implement;
var parser = implementation.createLSPareser(implementation.MODE.SYNCHRONOUS,null);
var input = implementation.createLSInput();
input.stringData = "<root/>";
var xmldom = parser.parse(input);
var newInput = implementation.createLSInput();
newInput.StringData = "<child/>";
parse.parseWithContext(newInput,xmldom.documentElement,parser.ACTION_APPEND_AS_CHILDREN);
alert(xmldom.documentElement.firstChild.tagName); //"child"
1.4.3 序列化XML
①要调用document.implementation上的createLSSerialization()方法,创建一个LSSerializer对象。LSSerializer对象的主要方法是writeToString(),接受一个节点类型参数并返回该节点的XML代码字符串表述。
②通过LSSerializer对象的domCOnfig属性来设置适合打印输出的XML字符串格式,即将该属性的"format_pretty_print"参数设为true。
③序列化期间发生错误,错误会被抛出。通过将writeToStirng()放try-catch语句中,可以测试是否发生了错误。
var serializer = implementation.createLSSerializer();
serializer.domConfig.setParameter("format_pretty_print",true);
var xml = "";
try{
Xml = serializer.writeToString(xmldom);
}catch(ex){
Alert("Serialization error occurred");
}
alert(xml);
1.5 IE对XML的支持
①IE有6种不同的XML文档版本可供选择,只建议其中3种:
□MSXML2.DOMDocument:为方便脚本处理而更新的版本,建议仅在特殊情况下作后备版本使用。
□MSXML2.DOMDocument.3.0:为了在JavaScript中使用,这是最低的建议版本。
□MSXML2.DOMDocument.6.0:通过脚本能够可靠地处理的最新版本。
□确定可用版本:
function createDocument(){
if(typeof arguments.callee.activeXString ! = "string"){
var versions = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"];
for(var i = 0, len = versions.length; i < len; i++){
try{
var xmldom = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xmldom;
}catch(ex){
//跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
②要解析XML字符串,先创建XML DOM文档,然后调用其loadXML()方法。
var xmldom = createDocument();
xmldom.loadXML("<root><child/></root>");
□在新DOM文档中填充了XML内容后,就可以像操作其他DOM文档一样操作它了(可以使用任何方法和属性)
③如果解析过程中出错,可以在parseError属性对象中找到错误。包含多个保存错误信息的属性。
□errorCode:错误类型的数值编码;没有发生错误时值为0
□filePos:文件中导致错误发生的位置。
□line:发生错误的行。
□linepos:发生错误的行中的字符。
□reason:对象错误地文本解析。
□srcText:导致错误的代码。
□url:导致错误的文件的URL。
□parseError的valueof()方法返回errorCode的值。
if(xmldom.parseError != 0){
alert("An error occurred: \n Error Code:"+xmldom.parseError.errorCoed + "\n"
+ "line:" + xmldom.parseError.line + "\n"
+ "line.Pos" + xmldom.parseError.linepos + "\n"
+ "Reson:" + xmldom.parseError.reason
);
}
1.5.1序列化XML
IE序列化XML的能力内置在了XML DOM文档中。每个XML DOM节点都有一个xml属性,其中保存着表示该节点的XML字符串。alert(xmldom.xml)
1.5.2 加载XML文件
①与DOM3级功能类似,要加载的XML文档必须与JS代码来自同一服务器。