XML DOM摘要三(XML DOM节点增、删、改、查)

定位 DOM 节点

通过节点间的关系访问节点树中的节点,通常称为定位节点 ("navigating nodes")。

在 XML DOM 中,节点的关系被定义为节点的属性:

  • parentNode
  • childNodes
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

下面的图像展示了 books.xml 中节点树的一个部分,并说明了节点之间的关系:

DOM - 父节点

所有的节点都仅有一个父节点。下面的代码定位到 <book> 的父节点:

xmlDoc=loadXMLDoc("books.xml");

//获取第一个 <book> 元素
x=xmlDoc.getElementsByTagName("book")[0];

//输出 "x" 的父节点的节点名
document.write(x.parentNode.nodeName);

避免空的文本节点

Firefox,以及其他一些浏览器,把空的空白或换行当作文本节点,而 IE 不会这么做。

这会在使用下列属性使产生一个问题:firstChild、lastChild、nextSibling、previousSibling。

为了避免定位到空的文本节点(元素节点之间的空格和换行符号),我们使用一个函数来检查节点的类型:

function get_nextSibling(n)
{
y=n.nextSibling;
//元素节点的类型是 1。如果同级节点不是元素节点,就移动到下一个节点,直到找到元素节点为止。通过这个办法,在 IE 和 Firefox 中,都可以得到相同的结果。
while (y.nodeType!=1)
  {
  y=y.nextSibling;
  }
return y;
}

 

有了上面的函数,我们就可以使用 get_nextSibling(node) 来代替 node.nextSibling 属性。

<html>
<head>
<script type="text/javascript" src="loadxmldoc.js">
</script>
<script type="text/javascript">
//check if the first node is an element node
function get_firstChild(n)
{
//获取第一个元素
y=n.firstChild;

//获取最一个元素
//y=n.lastChild;

//获取下一个同级元素
//y=n.nextSibling;

//获取上一个同级元素
//y=n.previousSibling;

while (y.nodeType!=1)
  {
  y=y.nextSibling;
  }
return y;
}
</script>
</head>

<body>
<script type="text/javascript">
xmlDoc=loadXMLDoc("books.xml");

x=get_firstChild(xmlDoc.getElementsByTagName("book")[0]);
document.write(x.nodeName);
</script>
</body>
</html>

获取元素的值

在 DOM 中,每种成分都是节点。元素节点没有文本值。

元素节点的文本存储在子节点中。该节点称为文本节点。

获取元素文本的方法,就是获取这个子节点(文本节点)的值。

获取元素值

getElementsByTagName() 方法返回包含拥有指定标签名的所有元素的节点列表,其中的元素的顺序是它们在源文档中出现的顺序。

xmlDoc=loadXMLDoc("books.xml");

x=xmlDoc.getElementsByTagName("title")[0];

childNodes 属性返回子节点的列表。<title> 元素只有一个子节点,即一个文本节点。

下面的代码检索 <title> 元素的文本节点:

x=xmlDoc.getElementsByTagName("title")[0];
y=x.childNodes[0];

nodeValue 属性返回文本节点的文本值:

x=xmlDoc.getElementsByTagName("title")[0];
y=x.childNodes[0];
txt=y.nodeValue;

获取属性的值

在 DOM 中,属性也是节点。与元素节点不同,属性节点拥有文本值。

获取属性的值的方法,就是获取它的文本值。

可以通过使用 getAttribute() 方法或属性节点的 nodeValue 属性来完成这个任务。

获取属性值 - getAttribute()

getAttribute() 方法返回属性的值。

下面的代码检索第一个 <title> 元素的 "lang" 属性的文本值:

xmlDoc=loadXMLDoc("books.xml");

//把 txt 变量设置为第一个 title 元素节点的 "lang" 属性的值
txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");

获取属性值 - getAttributeNode()

getAttributeNode() 方法返回属性节点。

下面代码检索第一个 <title> 元素的 "lang" 属性的文本值:

xmlDoc=loadXMLDoc("books.xml");

//获取第一个 <title> 元素节点的 "lang" 属性节点
x=xmlDoc.getElementsByTagName("title")[0].getAttributeNode("lang");

//把 txt 变量设置为属性的值
txt=x.nodeValue;

改变元素的值

在 DOM 中,每种成分都是节点。元素节点没有文本值。

元素节点的文本存储在子节点中。该节点称为文本节点。

改变元素文本的方法,就是改变这个子节点(文本节点)的值。

改变文本节点的值

nodeValue 属性可用于改变文本节点的值。

下面的代码片段改变了第一个 <title> 元素的文本节点值:

xmlDoc=loadXMLDoc("books.xml");

//获取第一个 <title> 元素的文本节点
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];

//把此文本节点的节点值更改为 "Hello World"
x.nodeValue="Hello World";

改变属性的值

在 DOM 中,属性也是节点。与元素节点不同,属性节点拥有文本值。

改变属性的值的方法,就是改变它的文本值。

可以通过使用 setAttribute() 方法或属性节点的 nodeValue 属性来完成这个任务

通过使用 setAttribute() 来改变属性

setAttribute() 方法设置已有属性的值,或创建新属性。

下面的代码改变 <book> 元素的 category 属性:

xmlDoc=loadXMLDoc("books.xml");

//获取第一个 <book> 元素
x=xmlDoc.getElementsByTagName('book');

//把 "category" 属性的值更改为 "child"
x[0].setAttribute("category","child");

注释:如果属性节点不存在,则创建一个新属性(拥有指定的名称和值)。

通过使用 nodeValue 改变属性

nodeValue 属性可用于更改属性节点的值:

xmlDoc=loadXMLDoc("books.xml");

x=xmlDoc.getElementsByTagName("book")[0]

//获取第一个 <book> 元素的 "category" 属性
y=x.getAttributeNode("category");

//把该属性节点的值更改为 "child"
y.nodeValue="child";

删除元素节点

removeChild() 方法删除指定的节点。

当一个节点被删除时,其所有子节点也会被删除。

下面的代码片段将从载入的 xml 中删除第一个 <book> 元素:

xmlDoc=loadXMLDoc("books.xml");

//把变量 y 设置为要删除的元素节点
y=xmlDoc.getElementsByTagName("book")[0];

//通过使用 removeChild() 方法从父节点删除元素节点
xmlDoc.documentElement.removeChild(y); 

删除自身 - 删除当前的节点

removeChild() 方法是唯一可以删除指定节点的方法。

当你已定位需要删除的节点时,就可以通过使用 parentNode 属性和 removeChild() 方法来删除此节点:

xmlDoc=loadXMLDoc("books.xml");

//把变量 y 设置为要删除的元素节点
x=xmlDoc.getElementsByTagName("book")[0];

//通过使用 parentNode 属性和 removeChild() 方法来删除此元素节点
x.parentNode.removeChild(x); 

删除文本节点

removeChild() 方法可用于删除文本节点:

xmlDoc=loadXMLDoc("books.xml");

//把变量 x 设置为第一个 title 元素节点
x=xmlDoc.getElementsByTagName("title")[0];

//把变量 y 设置为 要删除的文本节点
y=x.childNodes[0];

//通过使用 removeChild() 方法从父节点删除节点
x.removeChild(y); 

注释:不太常用 removeChild() 从节点删除文本。可以使用 nodeValue 属性代替它。请看下一段。

清空文本节点

nodeValue 属性可用于改变或清空文本节点的值:

xmlDoc=loadXMLDoc("books.xml");

//把变量 x 设置为第一个 title 元素的文本节点
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];

//使用 nodeValue 属性来清空文本节点的文本
x.nodeValue=""; 

根据名称删除属性节点

removeAttribute(name) 方法用于根据名称删除属性节点。

Example: removeAttribute('category')

下面的代码片段删除第一个 <book> 元素中的 "category" 属性:

xmlDoc=loadXMLDoc("books.xml");

//使用 getElementsByTagName() 来获取 book 节点
x=xmlDoc.getElementsByTagName("book");

//从第一个 book 元素节点中删除 "category" 属性
x[0].removeAttribute("category"); 

根据对象删除属性节点

removeAttributeNode(node) 方法通过使用 Node 对象作为参数,来删除属性节点。

Example: removeAttributeNode(x)

下面的代码片段删除所有 <book> 元素的所有属性:

xmlDoc=loadXMLDoc("books.xml");

//使用 getElementsByTagName() 来获取所有 book 节点
x=xmlDoc.getElementsByTagName("book");

//检查每个 book 元素是否拥有属性
for (i=0;i<x.length;i++)
{
//如果在某个 book 元素中存在属性,则删除该属性
while (x[i].attributes.length>0)
  {
  attnode=x[i].attributes[0];
  old_att=x[i].removeAttributeNode(attnode);
  }
}

替换元素节点

replaceChild() 方法用于替换节点。

下面的代码片段替换第一个 <book> 元素:

mlDoc=loadXMLDoc("books.xml");

x=xmlDoc.documentElement;

//创建一个 book 元素、一个 title 元素,以及一个 text 节点
newNode=xmlDoc.createElement("book");
newTitle=xmlDoc.createElement("title");
newText=xmlDoc.createTextNode("Hello World");

//向 title 节点添加文本节点
newTitle.appendChild(newText);

//向 book 节点添加 title 节点
newNode.appendChild(newTitle);

y=xmlDoc.getElementsByTagName("book")[0];

//用这个新节点替换第一个 book 节点
x.replaceChild(newNode,y);

替换文本节点中的数据

replaceData() 方法用于替换文本节点中的数据。

replaceData() 方法有三个参数:

  • offset - 在何处开始替换字符。Offset 值以 0 开始。
  • length - 要替换多少字符
  • string - 要插入的字符串
xmlDoc=loadXMLDoc("books.xml");

//获取第一个 <title> 元素节点的文本节点
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];

//使用 replaceData 方法把文本节点的前 8 个字符替换为 "hello"
x.replaceData(0,8,"hello");

使用 nodeValue 属性

用 nodeValue 属性来替换文本节点中数据会更加容易。

下面的代码片段将用 "Easy Italian" 替换第一个 <title> 元素中的文本节点值:

xmlDoc=loadXMLDoc("books.xml");

x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];

x.nodeValue="Hello World";

创建新的元素节点

createElement() 方法创建新的元素节点:

xmlDoc=loadXMLDoc("books.xml");

//创建一个新的元素节点 <edition>
newel=xmlDoc.createElement("edition");

x=xmlDoc.getElementsByTagName("book")[0];

//向第一个 <book> 元素追加这个元素节点
x.appendChild(newel);

创建新的属性节点

createAttribute() 用于创建新的属性节点:

xmlDoc=loadXMLDoc("books.xml");

//创建一个新的属性节点 "edition"
newatt=xmlDoc.createAttribute("edition");
newatt.nodeValue="first";

//向第一个 <title> 元素添加这个新的属性节点
x=xmlDoc.getElementsByTagName("title");
x[0].setAttributeNode(newatt); 

注释:如果该属性已存在,则被新属性替代。

通过使用 setAttribute() 来创建属性

由于 setAttribute() 可以在属性不存在的情况下创建新的属性,我们可以使用这个方法来创建新属性。

xmlDoc=loadXMLDoc("books.xml");

x=xmlDoc.getElementsByTagName('book');

//为第一个 <book> 元素设置(创建)值为 "first" 的属性
x[0].setAttribute("edition","first");

创建文本节点

createTextNode() 方法创建新的文本节点:

xmlDoc=loadXMLDoc("books.xml");

//创建一个新元素节点 <edition>
newel=xmlDoc.createElement("edition");

//创建一个新的文本节点,其文本是 "first"
newtext=xmlDoc.createTextNode("first");

//向这个元素节点追加新的文本节点
newel.appendChild(newtext);

//向第一个 <book> 元素追加新的元素节点
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newel);

创建一个 CDATA Section 节点

createCDATASection() 方法创建一个新的 CDATA section 节点。

xmlDoc=loadXMLDoc("books.xml");

//创建一个新的 CDATA section 节点
newCDATA=xmlDoc.createCDATASection("Special Offer & Book Sale");

//向第一个 <book> 元素追加这个新的 CDATA section 节点
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newCDATA);

创建注释节点

createComment() 方法创建一个新的注释节点。

xmlDoc=loadXMLDoc("books.xml");

//创建一个新的注释节点
newComment=xmlDoc.createComment("Revised March 2008");

//把这个新的注释节点追加到第一个 <book> 元素
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newComment);

添加节点 - appendChild()

appendChild() 方法向已存在的节点添加子节点。

新节点会添加(追加)到任何已存在的子节点之后。

注释:如果节点的位置很重要,请使用 insertBefore() 方法。

下面的代码片段创建一个元素(<edition>),并把它添加到第一个 <book> 元素最后一个子节点后面:

xmlDoc=loadXMLDoc("books.xml");

//创建一个新节点 <edition>
newel=xmlDoc.createElement("edition");

//把这个节点追加到第一个 <book> 元素
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newel);

插入节点 - insertBefore()

insertBefore() 方法用于在指定的子节点之前插入节点。

在被添加的节点的位置很重要时,此方法很有用。

xmlDoc=loadXMLDoc("books.xml");

//创建一个新的元素节点 <book>
newNode=xmlDoc.createElement("book");

//把这个节点插到最后一个 <book> 元素节点之前
x=xmlDoc.documentElement;
y=xmlDoc.getElementsByTagName("book")[3];

x.insertBefore(newNode,y);

注释:如果 insertBefore() 的第二个参数是 null,新节点将添加到最后一个已有的子节点之后。

x.insertBefore(newNode,null) 和 x.appendChild(newNode) 都可以向 x 追加一个新的子节点

添加新属性

addAtribute() 这个方法是不存在的。

如果属性不存在,则 setAttribute() 可创建一个新的属性:

xmlDoc=loadXMLDoc("books.xml");

//把第一个 <book> 元素的 "edition" 属性的值设置(创建)"first"
x=xmlDoc.getElementsByTagName('book');
x[0].setAttribute("edition","first");

注释:如果属性已存在,setAttribute() 方法将覆盖已有的值。

向文本节点添加文本 - insertData()

insertData() 方法将数据插入已有的文本节点中。

insertData() 方法有两个参数:

  • offset - 在何处开始插入字符(以 0 开始)
  • string - 要插入的字符串

下面的代码片段将把 "Easy" 添加到已加载的 XML 的第一个 <title> 元素的文本节点:

xmlDoc=loadXMLDoc("books.xml");

x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];

x.insertData(0,"Hello ");

复制节点

cloneNode() 方法创建指定节点的副本。

cloneNode() 方法有一个参数(true 或 false)。该参数指示被复制的节点是否包括原节点的所有属性和子节点。

下面的代码片段拷贝第一个 <book> 节点,并把它追加到文档的根节点:

xmlDoc=loadXMLDoc("books.xml");

//获取要复制的节点
oldNode=xmlDoc.getElementsByTagName('book')[0];

//通过使用 cloneNode 方法把节点复制到 "newNode" 中
newNode=oldNode.cloneNode(true);

//向 XML 文档的根节点追加新节点
xmlDoc.documentElement.appendChild(newNode);

//输出文档中所有 book 的 title
y=xmlDoc.getElementsByTagName("title");
for (i=0;i<y.length;i++)
{
document.write(y[i].childNodes[0].nodeValue);
document.write("<br />");
}

//输出:
Harry Potter
Everyday Italian
XQuery Kick Start
Learning XML
Harry Potter

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值