JavaScript高级程序设计 XML、Ajax 学习笔记

第十五章 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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdjpwj.html