Firefox中的XML DOM

现在我们来看看Firefox中的XML DOM实现,Firefox的开发人员采用更为标准的方法,将其作为JavaScript实现的一部分。Mozilla确保所有基于Gecko的浏览器的所有平台都支持XML DOM。
Firefox中创建一个XML DOM,需要调用 document.implementation对象的 createDocument()方法。该方法接受三个参数:第一个参数是包含文档所使用的命名空间URI的字符串;第二个参数是包含文档根元素名称的字符串;第三个参数是要创建的文档类型(也称为doctype)。如果要创建空的DOM文档,则代码如下所示:
var oXmlDom = document.implementation.createDocument("", "", null);
前两个参数是空字符串,第三个参数为 null,这样可以确保生成一个彻底的空文档。事实上,现在Firefox中并不提供针对文档类型的JavaScript支持,所以第三个参数总是为 null。如果要创建包含文档元素的XML DOM,那么可以在第二个参数中指定标签名称:
var oXmlDom = document.implementation.createDocument("", "books", null);
这段代码创建了一个XML DOM,其 documentElement<books/>。如果要创建包含指定命名空间的DOM,可以在第一个参数中指定命名空间URI:
var oXmlDom = document.implementation.createDocument(http://www.site1.comd, "books", null);
当在 createDocument()方法中指定命名空间时, Firefox会自动附上前缀 a0 以表示命名空间URI:
<a0:books xmlns:a0="http://www.site1.com" />
接着,你可以通过程序来填充XML文档,不过在一般情况下,还需要在空的XML DOM对象中载入现有的XML文档。
1. 在Firefox中载入XML数据
在Firefox中,将XML载入XML DOM的方法和微软采用的方法大致相同,只存在一个显著区别:Firefox只支持 load()方法。因此,在这两种浏览器中载入外部XML数据的代码是相同的:
oXmlDom.load("books.xml");
与微软的IE一样,Firefox同样实现了 async属性,该属性的行为也与其一致:将 async设置为 false,表示以同步模式载入文档;否则,以异步模式载入文档。
Firefox的XML DOM实现和微软的XML DOM实现还存在另一个不同,即Firefox不支持 readyState属性及 onreadystatechange事件处理函数。在Firefox中,支持 load事件和 onload事件处理函数。在文档完全载入后将触发on load事件:
oXmlDom.load("books.xml");
oXmlDom.onload = function () {
    //文档完全载入后的操作
};
正如前面所说,在Firefox的XML DOM实现中,并没有 loadXML()方法,不过通过Firefox中的 DOMParser类可以模拟 loadXML()的行为。该类有一个名为 parseFromString()的方法,用来载入字符串并解析成文档:
var sXml = "<root><person><name>Jeremy McPeak</name></person></root>";
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml,"text/xml");
在这段代码中,创建了一个XML字符串,并作为参数传递给 DOMParserparseFromString()方法。 parseFromString()方法的两个参数分别是XML字符串和数据的内容类型(一般设置为 text/xml)。 parseFromString()方法返回XML DOM对象,因此这里得到的 oXmlDom与第一个例子相同。
2. 在Firefox中获取XML数据
尽管存在这样那样的不同,但IE和Firefox中用于获取文档中XML数据的大多数属性和方法是一致的。正如在IE中,可以使用 documentElement属性来获取文档的根元素,例如:
var oRoot = oXmlDom.documentElement;
Firefox 同样支持 W3C 标准属性,包括 childNodes firstChild lastChild nextSibling nodeName nodeType nodeValue ownerDocument parentNode previousSibling 。不幸的是,对于微软专有的 text xml 属性, Firefox 并不支持,不过可以利用其他方法来模拟该属性的行为。
大家应该还记得, text属性返回了当前节点的内容,或者是当前节点及其子节点的内容。这不仅仅返回当前节点的文本,还有所有子节点的文本,因此要模拟该功能实现是十分容易的。下面这个简单的函数就能够完成该功能,该函数唯一的参数是一个节点:
function getText(oNode) {
    var sText = "";
    for (var i = 0; i < oNode.childNodes.length; i++) {
       if (oNode.childNodes[i].hasChildNodes()) {
           sText += getText(oNode.childNodes[i]);
       } else {
           sText += oNode.childNodes[i].nodeValue;
       }
    }
    return sText;
}
getText()函数中, sText变量用来保存获取的所有文本。接着对 oNode的子节点使用 for 循环进行遍历,检查每个子节点是否包含子节点。如果有子节点,那么就将其 childNode传给 getText()函数,并进行同样的处理;如果没有子节点,那么将当前节点的 nodeValue加到字符串中(对文本节点而言,这只是文本字符串)。处理了所有子节点后,该函数返回变量 sText
IE中的 xml属性将存放对当前节点包含的所有XML进行序列化的结果。在Firefox中,提供了一个名为 XMLSerializer对象来完成这一功能。该对象提供一个使用JavaScript可访问的 serializeToString()方法,使用该方法可以对XML数据进行序列化。
function serializeXml(oNode) {
    var oSerializer = new XMLSerializer();
    return oSerializer.serializeToString(oNode);
}
serializeXml()函数以XML节点作为参数,创建一个 XMLSerializer对象,并将该节点传给 serializeToString()方法。该方法将向调用者返回XML数据的字符串表示。
对于节点操作的DOM 方法,Firefox 与IE 大致相同。参见“在IE 中操作DOM ”小节。
3. 在Firefox中处理错误
Firefox与IE的错误处理并不一样。当IE遇到错误时,它会填充 parseError对象;而当Firefox遇到错误时,它会将包含错误信息的XML文档载入到XML DOM文档中。看下面的这个例子:
var sXml = "<root><person><name>Jeremy McPeak</name></root>";
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml,"text/xml");
 
if (oXmlDom.documentElement.tagName != "parsererror") {
    //没有错误发生,进行所需操作
} else {
    alert("An Error Occurred");
}
在突出显示的代码行中,你会发现其中将产生一个错误:XML字符串格式不正确(因为 <person>元素不完整,没有相应的 </person>元素)。当载入错误的XML时,XML DOM对象将会载入一个 documentElement<parsererror/>的错误文档。我们可以通过检查 documentElementtagName属性来很容易地确定是否发生错误。如果 tagName属性不是 parsererror,就可以确定没有发生任何错误。
在本例中,可能会生成如下所示的错误文档:
<parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">XML
Parsing Error: mismatched tag. Expected: </person>.
Location: http://yoda/fooreader/test.htm
Line Number 1, Column 43:<sourcetext><root><person><name>Jeremy
McPeak</name></root>
------------------------------------------^</sourcetext></parsererror>
所有的错误信息都包含在错误文档的文本中。如果要通过程序使用这些错误信息,那么首先就要对其进行解析。最简单的方法是使用一个稍长的正则表达式:
var reError = />([/s/S]*?)Location:([/s/S]*?)Line Number (/d+), Column (/d+):<sourcetext>([/s/S]*?)(?:/-*/^)/;
该正则表达式将错误文档分为五个部分:错误消息、发生错误的文件名、行号、该行中发生错误的位置,以及发生错误的源代码。使用正则表达式对象的 test()方法可以使用这些信息:
if (oXmlDom.firstChild.tagName != "parsererror") {
    //没有错误发生,进行所需操作
} else {
    var oXmlSerializer = new XMLSerializer();
    var sXmlError = oXmlSerializer.serializeToString(oXmlDom);
    var reError = />([/s/S]*?)Location:([/s/S]*?)Line Number (/d+), Column (/d+):<sourcetext>([/s/S]*?)(?:/-*/^)/;
    reError.test(sXmlError);
正则表达式捕获到的第一部分数据是错误消息,第二部分是文件名,第三部分是行号,第四部分是行内位置,第五部分是源码。你可以使用这些解析后的信息来创建自定义的错误消息:
var str = "An error occurred!!/n" +
    "Description: " + RegExp.$1 + "/n" +
    "File: " + RegExp.$2 + "/n" +
    "Line: " + RegExp.$3 + "/n" +
    "Line Position: " + RegExp.$4 + "/n" +
    "Source Code: " + RegExp.$5;
alert(str);
如果发生错误,那么 alert()方法会以易于阅读的格式在警告框中来显示相关的错误信息。
 
DOM Inspector是Mozilla Firefox的一个扩充套件,官方文版上称之为DOM观察器,在安装Mozilla Firefox时,可以在自订安装选择是否安装DOM Inspector,如果在安装Mozilla Firefox时没有选择自订安装以安装DOM Inspector,则可以在 Mozilla 的 DOM Inspector 网址进行安装。 Ajax应用程式经常操作DOM Tree,您可以直接使用DOM Inspector来观察DOM Tree对应於网页画面的哪个元件,执行Mozilla Firefox官方文版的「工具/DOM观察器」,可以显示DOM Inspector视窗,在网址列输入网址,并按下「观察」按钮,即可开始观察DOM与网页的对应,对应的画面会以红色方框闪烁显示。 如果您想要找寻特定的DOM节点,则可以执行「搜寻/寻找节点」,搜寻的方式可以有依「Id」、「Tag」或「Attr」等来进行搜寻。 在找到想观察的节点后,可以在左边的窗格观察到该节点的各种属性,预设是显示JavaScript物件的各种属性,例如可在下图,观察到onmouseover与onmouseoout的事件处理者分别是getBookData()与clearData(): 例如可以切换至DOM Node的检视模式,您也可以在某个属性上按右键「编辑」,直接改变某个DOM的属性值,像是改变src属性: 您甚至可以选定一个DOM节点,在JavaScript检视,按右键「执行JavaScript」… 您还可以在 Introduction to the DOM Inspector 找到一些关於DOM Inspector的介绍。 安装方式:使用直接把该文件拖动到fifefox上或使用firefox-文件-打开-选择下载的文件-确定。。。即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值