元素的最后一个子节点。此外,元素是、、以及元素的父节点。
Note:
父节点:
ParentNode,子节点:
ChildrenNode,同级节点:
SiblingNode
本文出自51CTO.COM技术博客
JavaScript操作XML
(二)
这一篇介绍浏览器内建的XML解析器以及JavaScript是如何加载XML的。
大多数浏览器都有读取和操作XML的内建XML解析器。
解析器(XMLParser)把XML转换为JavaScript可访问的对象。
解析器把XML载入内存,然后把它转换为可通过JavaScript访问的XMLDOM对象。
微软的XML解析器与其他浏览器中的解析器之间,存在一些差异。
微软的解析器支持XML文件和XML字符串(文本)的加载,而其他浏览器使用单独的解析器。
不过,所有的解析器都包含遍历XML树、访问插入及删除节点(元素)及其属性的函数。
Note:
当我们谈及XML解析,我们常常会使用有关XML元素的术语:
节点。
一、IE通过微软的XML解析器来加载XML
微软的XML解析器内建于InternetExplorer5以及更高的版本中。
下面的JavaScript片段把一个XML文档载入解析器中:
varxmlDoc=newActiveXObject("Microsoft.XMLDOM");xmlDoc.async="false";xmlDoc.load("note.xml");例子解释:
1.上面代码的第一个行创建一个空的微软XML文档对象。
2.第二行关闭异步加载,这样确保在文档完全加载之前解析器不会继续脚本的执行。
3.第三行告知解析器加载名为"note.xml"的XML文档。
下面的JavaScript片段把字符串txt载入解析器:
varxmlDoc=newActiveXObject("Microsoft.XMLDOM");xmlDoc.async="false";xmlDoc.loadXML(txt);注释:
loadXML()方法用于加载字符串(文本),load()用于加载文件。
二、Firefox及其他浏览器中的XML解析器下面的JavaScript片段把XML文档("note.xml")载入解析器:
varxmlDoc=document.implementation.createDocument("","",null);xmlDoc.async="false";xmlDoc.load("note.xml");例子解释:
1.上面代码的第一个行创建一个空的XML文档对象。
2.第二行关闭异步加载,这样确保在文档完全加载之前解析器不会继续脚本的执行。
3.第三行告知解析器加载名为"note.xml"的XML文档。
下面的JavaScript片段把字符串txt载入解析器:
varparser=newDOMParser();varxmlDoc=parser.parseFromString(txt,"text/xml");例子解释:
1.上面代码的第一个行创建一个空的微软XML文档对象。
2.第二行告知解析器载入名为txt的字符串。
注释:
DOMParser对象的parseFromString()方法用于加载字符串(文本),load()用于加载文件。
三、跨域访问出于安全方面的原因,现代的浏览器不允许跨域的访问。
假如你打算在自己的网页上使用上面的例子,则必须把XML文件放到自己的服务器上。
否则,xmlDoc.load()将产生错误"Accessisdenied"。
JavaScript操作XML(三)
上一篇介绍了XML如何加载到JavaScript解析器。
这一篇介绍加载到解析器后,JavaScript是如何访问节点的。
在详细介绍如何使用上面的方法前,我们先来了解下节点的主要属性。
documentElement属性:
XML文档的根节点。
nodeName属性:
节点的名称(只读)。
nodeValue属性:
节点的值。
nodeType属性:
节点的类型。
childNodes属性:
返回子节点集合。
parentNode属性:
返回父节点。
firstChild属性:
返回第一个子节点。
lastChild属性:
返回最后一个子节点。
nextSibling属性:
返回下一个兄弟(同级)节点。
previousSibling属性:
返回前一个兄弟(同级)节点。
nodeName属性nodeName属性规定节点的名称。
∙nodeName是只读的
∙元素节点的nodeName与标签名相同
∙属性节点的nodeName是属性的名称
∙文本节点的nodeName永远是#text
∙文档节点的nodeName永远是#document
nodeValue属性nodeValue属性规定节点的值。
∙元素节点的nodeValue是undefined
∙文本节点的nodeValue是文本自身
∙属性节点的nodeValue是属性的值
nodeType属性nodeType属性规定节点的类型。
nodeType是只读的。
最重要的节点类型是:
元素类型
节点类型
元素
1
属性
2
文本
3
注释
8
文档
9
您可以通过四种方法来访问节点:
1、通过getElementsById()方法。
用法:
varxNode=xmlDoc.getElementsById('ID');
解释:
这个方法我想大家已经很熟悉了。
就是如果XML里有个id='ID'的Node,那个就返回这个Node节点,否则返回null。
在得到这个Node后,就可以用上面的属性进行访问了。
ps:
xmlDoc的定义可以在上一篇文章中找到。
2、通过getElementsByTagName()方法。
用法:
vararrNodes=xmlDoc.getElementsByTagName('TagName');
解释:
这个方法是根据tagname返回一个数组。
此方法最常用。
例子1:
//xml内容:
JavaScript操作XML
(一)
vararrNodes=xmlDoc.getElementsByTagName("title");
for(i=0;i {
alert(arrNodes.childNodes[0].nodeValue);
}
例子2:
//获取第一个
元素节点的文本节点。
注意,元素内的文本是元素的子节点,叫文本节点。
varxNode=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
alert(xNode.nodeValue);//文本节点的值。
output"EverydayItalian"
3、通过循环(遍历)节点树。
这个方法没什么好说的,就是用for循环结合childNodes遍历所以的节点。
例子:
x=xmlDoc.documentElement.childNodes;
for(i=0;i{
document.write(x.nodeName);
document.write("
");
}
4、通过节点的关系在节点树中导航。
这个方法是根据当前节点得到parentNode、firstChild、lastChild、nextSibling、previousSibling来移动。
x=xmlDoc.getElementsByTagName("book")[0].childNodes;
y=xmlDoc.getElementsByTagName("book")[0].firstChild;
for(i=0;i{
document.write(y.nodeName+"
");
y=y.nextSibling;
}
JavaScript操作XML(四)
上一篇介绍了JavaScript主要是通过什么方法来访问节点的。
这一篇介绍JavaScript是如何操作节点的(包括增、删、改、查)。
通过前面的介绍,我们知道XML文档中,主要是元素节点、属性节点和文本节点。
下面详细介绍JavaScript是如何操作它们的。
元素节点:
查找:
上一篇已介绍。
主要是通过方法getElementsByTagName来查找定位。
例子:
//输出所有的titles
vart=xmlDoc.getElementsByTagName("title");
for(i=0;i{
document.write(t.childNodes[0].nodeValue);
document.write("
");
}
添加:
主要是用createElement创建元素,然后用appendChild附加子节点的形式实现。
例子:
varnewNode=xmlDoc.createElement("NewElementName");//创建元素节点
varnodeBook=xmlDoc.getElementsByTagName("book")[0];//找到节点book
nodeBook.appendChild(newNode);//把newNode作为子节点追加到父节点book的子节点后面。
也就是说,要追加节点,必须先找到父节点。
另外,还可以通过克隆的方式添加节点。
cloneNode()方法有一个参数(true或false)。
该参数指示被复制的节点是否包括原节点的所有属性和子节点。
例子:
oldNode=xmlDoc.getElementsByTagName('book')[0];
newNode=oldNode.cloneNode(true);//克隆复制原节点以及所有属性和子节点
xmlDoc.documentElement.appendChild(newNode);
删除:
父节点调用removeChild实现。
例如:
varnodeBook=xmlDoc.getElementsByTagName("book")[0];//找到节点book
xmlDoc.documentElement.removeChild(nodeBook);//删除根节点下面的第一个book节点
注意:
删除某个节点,它下面的子节点也会被同时删除。
修改:
不允许直接修改元素。
若真要修改可以用replaceChild间接完成。
语法是:
parentNode.replaceChild(newNode,oldNode)
另外,元素没有nodeValue。
若要修改元素内的文本,如修改
hello里的hello,可参考下面的操作文本节点。
文本节点:
查找:
查找文本节点不能直接用getElementsByTagName,而是先用它找到元素节点,然后再用childNodes[0]或firstChild来定位文本节点(因为它是以元素节点的第一个子节点的形式存在的),接着再用nodeValue即可得到文本内容。
例子:
varnodeTitle=xmlDoc.getElementsByTagName("title")[0];
vartitleTextNode=nodeTitle.childNodes[0];//也可以用firstChild
vartheTxt=titleTextNode.nodeValue;
添加:
类似于元素的添加方式,但文本的添加是通过createTextNode创建的(note:
在XHTML也可以用innerHTML的方式添加)。
例子:
varedition=xmlDoc.createElement("edition");
varnewtext=xmlDoc.createTextNode("thisisfirst");
edition.appendChild(newtext);//在操作XHTML时,上面这两行可直接用edition.innerHTML=’thisisfirst’代替;
varnodeBook=xmlDoc.getElementsByTagName("book")[0];
nodeBook.appendChild(edition);
删除:
父节点调用removeChild实现。
当然也可以用清空nodeValue的方式实现。
如textNode.nodeValue=’’。
修改:
textNode.nodeValue=’修改成你想要的文本内容’。
另外,文本节点的修改也可以用replaceData()替换文本节点中的数据。
replaceData()方法有三个参数:
offset-在何处开始替换字符。
Offset值以0开始。
length-要替换多少字符。
,
string-要插入的字符串。
例子:
xmlDoc.getElementsByTagName("title")[0].childNodes[0].replaceData(0,8,"hello");
//note:
其实完全可以用substr或者substring事先处理字符串,再赋值给nodeValue
属性节点:
查找:
与元素节点不同,属性节点拥有文本值。
获取属性的值的方法,就是获取它的文本值。
可以通过使用getAttribute()方法或属性节点的nodeValue属性来完成这个任务。
例子:
xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");//return“en”
或者
xmlDoc.getElementsByTagName("title")[0].getAttributeNode("lang").nodeValue;//return“en”
添加:
用setAttribute或者setAttributeNode实现。
例子:
xmlDoc.getElementsByTagName('book')[0].setAttribute("edition","thisisfirst");
或者
varnewAtt=xmlDoc.createAttribute("edition");
newAtt.nodeValue="thisisfirstfirst";
xmlDoc.getElementsByTagName("title")[0].setAttributeNode(newAtt);
删除:
可用removeAttribute(name)或者removeAttributeNode(node)
例子:
//方式1:
removeAttribute
//删除第一个元素中的"category"属性:
xmlDoc.getElementsByTagName("book")[0].removeAttribute("category");
//方式2:
removeAttributeNode
//删除所有元素的所有属性
x=xmlDoc.getElementsByTagName("book");
for(i=0;i{
while(x.attributes.length>0)
{
attnode=x.attributes[0];
old_att=x.removeAttributeNode(attnode);
}
}
修改:
通过使用setAttribute()方法或属性节点的nodeValue属性来完成。
例子:
//setAttribute
xmlDoc.getElementsByTagName('book')[0].setAttribute("category","child");
//setnodeValue
varx=xmlDoc.getElementsByTagName("book")[0]
vary=x.getAttributeNode("category");
y.nodeValue="child";