一、IE读取XML
var xmlDoc;
xmlDoc = new ActiveXObject( "Msxml2.DOMDocument" );
xmlDoc.loadXML(xml);
//取的节点
var points = xmlDoc.documentElement.getElementsByTagName("point");
//取得节点的内容值
points.childNodes[1].text
二
、firefox读取XML
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.com",
"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
事件处理函数。在文档完全载入后将触发
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
字符串,并作为参数传递给
DOMParser
的
parseFromString()
方法。
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.hasChildNodes()) {
sText += getText(oNode.childNodes);
} else {
sText += oNode.childNodes.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/>
的错误文档。我们可以通过检查
documentElement
的
tagName
属性来很容易地确定是否发生错误。如果
tagName
属性不是
parsererror
,就可以确定没有发生任何错误。
在本例中,可能会生成如下所示的错误文档:
<parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">XML
Parsing Error: mismatched tag. Expected: </person>.
Location: [url]http://yoda/fooreader/test.htm[/url]
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!! " +
"Description: " + RegExp.$1 + " " +
"File: " + RegExp.$2 + " " +
"Line: " + RegExp.$3 + " " +
"Line Position: " + RegExp.$4 + " " +
"Source Code: " + RegExp.$5;
alert(str);
如果发生错误,那么
alert()
方法会以易于阅读的格式在警告框中来显示相关的错误信息。