第十五章 JavaScript与XML
1.浏览器对XML DOM的支持
1.1 DOM2级核心
①在DOM2级在document.implementation中引入了createDocument()方法(IE6~8不支持)。
可以创建一个空白XML。
var xmldom = document.implemention.createDocument(namespaceUri,root,docype);
②要创建一个新的文档元素为<root>的XML文档,可用如下代码:
var xmldom = document.implementation.createDocument("","root",null);
aert(xmldom.documentElement.tagName); //"root"
var child = xmldom.createElement("child");
xmldom.documentElement.appendChild(child);
③检测浏览器是否支持DOM2级XML:
var hasXmlDom = document.implementation.hasFeature("XML","2.0");
1.2 DOMParse类型
①Firefox、Opera、Chrome、Safari支持(IE8不支持),DOMParse类型可将XML解析为DOM文档。
②创建一个DOMParse实例,再调用parseFromString()方法。这个方法接受两个参数:要解析的XML字符串和内容类型(内容类型始终为"text/xml")。返回值是一个Document实例。
var parser = new DOMParse();
var xmldom = parser.parseFromString("<root><child/></root>","text/xml");
alert(xmldom.documentElement.tagName); //"root"
alert(xmldom.documentElement.firstChild.tagName); //"child"
var anotherChild = xmldom.createElement("child");
xmldom.documentElement.appendChild(anthorChild);
var children = xmldom.getElementsByTagName("child");
alert(children.length); //2
③发生解析错误时,仍然会从parseFromString()中返回一个Document对象。但这个对象的文档元素是<parsererror>(Firefox、Opera);对象根元素第一个子元素为<parsererro>(Safari、Chrome)。
<parseerror>元素的内容是对解析错误地描述。通过getElementsByTagName()查找<parsererror>确定是否有解析错误。
var parse = new DOMParse();
var xmldom = parser.parseFromString("<root>","text/xml");
var errors = xmldom.getElementsByTagName("parsererror");
if(errors.length > 0 ){
alert("Parsing error!");
}
1.3 XMLSerializer类型
①此类可将DOM文档序列化为XML字符串。(IE6~8不支持)。
②要序列化DOM文档,首相必须创建XMLSerializer实例,然后将文档传入其serializerToString()方法:
var serializer = new XMLSerializer();
var xml = serializer.serializeToString(xmldom);
alert(xml);
1.4 DOM3级加载和保存
①DOM3级“加载和保存”规范的目的在于将加载、解析和序列化XML文档的任务标准化,模块规定了两个解析方法:同步方法和异步方法。
②检测DOM3级加载和保存
var hasLSSync = document.implementation.hasFeature("LS","3.0");
var hasLSAsync = document.implementation.hasFeature("LS-Async","3.0");
③DOM3级“加载和保存”还为document.implementation对象添加了下列新属性和新方法:
□MODE_SYNCHRONOUS:为同步解析方式定义的常量;
□MODE_ASYNCHRONOUS:为异步解析方式定义的常量;
□createLSParse(mode,schemaType):创建一个在指定方式(mode)下运行且符合指定模式(schema)类型的解析器。
□createLSSerializer():创建一个新XML序列化器。
□createLSInput():创建一个新的输入对象,用于解析/序列化操作。
□createLSOutput():创建一个新的输出对象,用于解析/序列化操作。
1.4.1 解析XML
(1)同步解析器
①需要先创建同步解析器。如果解析器并不想基于哪个模式进行验证,为createLSParser()的第二个参数传入null。如果需要基于XML模式进行验证,则应为第二个参数传入"http://www.w3.org/2001/XMLSchema",如果要基于XML DTD进行验证,则应该为第二个参数传入"http://www.w3.org/TR/REC-xml"。
②解析之前还要创建一个新的LSInput对象。为此,要使用createLSInput()方法;创建LSInput对象后,还需要将XML字符串赋值给该对象的stringData属性。
③解析完成后,就会返回一个XML DOM文档对象
④如果在同步解析方式下发生解析错误,则会抛出错误。
⑤示例:
var implementation = document.implementation;
var parser = implementation.createLSParser(implementation.MODE_SYNCHRONOUS,null);
var input = implement.createLSInput();
input.stirngData = "<root>";
try{
xmldom = parser.parse(input);
}catch(ex){
alert("Parsing error!");
}
(2)异步解析器
①需要在createLSParser()的第一个参数的位置上传入常量MODE_ASYNCHRONOUS。
②通过addEventListener()来预订load事件,以便知道文档何时解析完毕。
③如果异步解析期间发生错误,则不会触发load事件。要捕获这个错误,需要使用LSParser对象上一个名叫domConfig的特殊接口定义一个错误处理程序。(BUG:Opera9.5不会触发load)