XML学习记录之XML-DOM

来源:互联网 发布:穆雅斓淘宝店铺链接 编辑:程序博客网 时间:2024/06/15 20:13

 解析 XML DOM

在解析 XML DOM的解析过程中,IE和其他的浏览器使用不同的解析方式,下面的例子创建一个跨浏览器的解析

<html><body><script type="text/javascript">try //Internet Explorer  {  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");  }catch(e)  {  try //Firefox, Mozilla, Opera, etc.    {    xmlDoc=document.implementation.createDocument("","",null);    }  catch(e) {alert(e.message)}  }try   {  xmlDoc.async=false;  xmlDoc.load("books.xml");  document.write("xmlDoc is loaded, ready for use");  }catch(e) {alert(e.message)}</script></body></html>


 

1.创建空的 XML 文档对象

2.关闭异步加载,这样可确保在文档完整加载之前,解析器不会继续执行脚本

3.告知解析器加载名为 "books.xml" 的文档

在访问并处理 XML 文档之前,必须把它载入 XML DOM 对象,可以这样做:先创建一个脚本然后调用

function loadXMLDoc(dname) {try //Internet Explorer  {  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");  }catch(e)  {  try //Firefox, Mozilla, Opera, etc.    {    xmlDoc=document.implementation.createDocument("","",null);    }  catch(e) {alert(e.message)}  }try   {  xmlDoc.async=false;  xmlDoc.load(dname);  return(xmlDoc);  }catch(e) {alert(e.message)}return(null);}


 

<script type="text/javascript">xmlDoc=loadXMLDoc("books.xml");document.write("xmlDoc is loaded, ready for use");</script>


接下来就可以对节点进行操作了:

X节点基本的属性包括

x.nodeName - x 的名称

x.nodeValue - x 的值

x.parentNode - x 的父节点

x.childNodes - x 的子节点

x.attributes - x 的属性节点

定位一个节点包括三种方式:

  • 通过使用 getElementsByTagName() 方法
  • 通过循环(遍历)节点树
  • 通过利用节点的关系在节点树中导航
    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("book")[0].childNodes;y=xmlDoc.getElementsByTagName("book")[0].firstChild;for (i=0;i<x.length;i++){if (y.nodeType==1)  {//Process only element nodes (type 1)  document.write(y.nodeName + "<br />");  }y=y.nextSibling;}


    值得注意的是:XML 文档的 documentElement 属性是根节点。

    所以你可以这样循环根节点的子节点:

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.documentElement.childNodes;for (i=0;i<x.length;i++){   if (x[i].nodeType==1)  {//Process only element nodes (type 1)   document.write(x[i].nodeName);  document.write("<br />");  } }


     

    三个重要的 XML DOM 节点属性是:

    nodeName、nodeValue、nodeType

    nodeName 属性规定节点的名称。

    nodeName 是只读的;元素节点的 nodeName 与标签名相同;属性节点的 nodeName 是属性的名称;文本节点的 nodeName 永远是 #text;文档节点的 nodeName 永远是 #document;

    nodeValue 属性规定节点的值。

    元素节点的 nodeValue 是 undefined;文本节点的 nodeValue 是文本自身;属性节点的 nodeValue 是属性的值

    元素类型节点类型元素1属性2文本3注释8文档9

    如何得到节点下面的属性值:

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("book")[0].attributes;document.write(x.getNamedItem("category").nodeValue);document.write("<br />" + x.length);

    所有现代浏览器都支持 W3C DOM 规范。不过,浏览器之间是有差异的。重要的区别有两点:

    加载 XML 的方式、处理空白和换行的方式
    Firefox,以及其他一些浏览器,会把空的空白或换行作为文本节点来处理,而 Internet Explorer 不会这样。

    节点操作:

    获取元素值

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


    获取属性值 - getAttribute()与getAttributeNode()

    方法一xmlDoc=loadXMLDoc("books.xml");txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");方法二xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("title")[0].getAttributeNode("lang");txt=x.nodeValue;


    改变文本:

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];x.nodeValue="Hello World";


    改变属性,使用 setAttribute() 和nodeValue

    方法一xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName('book');x[0].setAttribute("category","child");方法二xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("book")[0]y=x.getAttributeNode("category");y.nodeValue="child";


    删除元素节点:

    xmlDoc=loadXMLDoc("books.xml");y=xmlDoc.getElementsByTagName("book")[0];xmlDoc.documentElement.removeChild(y); 


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

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("book")[0];x.parentNode.removeChild(x); 


    删除文本节点:

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("title")[0];y=x.childNodes[0];x.removeChild(y); 


    清空文本节点:

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];x.nodeValue=""; 


    根据名称删除属性节点:

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("book");x[0].removeAttribute("category"); 


    根据对象删除属性节点:

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

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("book");for (i=0;i<x.length;i++){while (x[i].attributes.length>0)  {  attnode=x[i].attributes[0];  old_att=x[i].removeAttributeNode(attnode);  }}


    替换元素节点:

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

    xmlDoc=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() 方法与使用 nodeValue 属性

    replaceData() 方法有三个参数:offset - 在何处开始替换字符。Offset 值以 0 开始。length - 要替换多少字符、string - 要插入的字符串

    方法一:xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];x.replaceData(0,8,"hello");方法二:xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];x.nodeValue="Hello World";


    创建新的元素节点:

    xmlDoc=loadXMLDoc("books.xml");newel=xmlDoc.createElement("edition");x=xmlDoc.getElementsByTagName("book")[0];x.appendChild(newel);


    创建新的属性节点:

    xmlDoc=loadXMLDoc("books.xml");newatt=xmlDoc.createAttribute("edition");newatt.nodeValue="first";x=xmlDoc.getElementsByTagName("title");x[0].setAttributeNode(newatt); 


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

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName('book');x[0].setAttribute("edition","first");


    创建文本节点:

    xmlDoc=loadXMLDoc("books.xml");newel=xmlDoc.createElement("edition");newtext=xmlDoc.createTextNode("first");newel.appendChild(newtext);x=xmlDoc.getElementsByTagName("book")[0];x.appendChild(newel);


    添加节点 - appendChild()

    xmlDoc=loadXMLDoc("books.xml");newel=xmlDoc.createElement("edition");x=xmlDoc.getElementsByTagName("book")[0];x.appendChild(newel);


    插入节点 - insertBefore()

    xmlDoc=loadXMLDoc("books.xml");newNode=xmlDoc.createElement("book");x=xmlDoc.documentElement;y=xmlDoc.getElementsByTagName("book")[3];x.insertBefore(newNode,y);


    添加新属性:

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName('book');x[0].setAttribute("edition","first");


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

    insertData() 方法有两个参数:offset - 在何处开始插入字符(以 0 开始)、string - 要插入的字符串

    xmlDoc=loadXMLDoc("books.xml");x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];x.insertData(0,"Hello ");


    本文使用的例子 books.xml

      <?xml version="1.0" encoding="ISO-8859-1" ?> - <!--   Copyright w3school.com.cn   --> - <!--  W3School.com.cn bookstore example   --> - <bookstore>- <book category="children">  <title lang="en">Harry Potter</title>   <author>J K. Rowling</author>   <year>2005</year>   <price>29.99</price>   </book>- <book category="cooking">  <title lang="en">Everyday Italian</title>   <author>Giada De Laurentiis</author>   <year>2005</year>   <price>30.00</price>   </book>- <book category="web" cover="paperback">  <title lang="en">Learning XML</title>   <author>Erik T. Ray</author>   <year>2003</year>   <price>39.95</price>   </book>- <book category="web">  <title lang="en">XQuery Kick Start</title>   <author>James McGovern</author>   <author>Per Bothner</author>   <author>Kurt Cagle</author>   <author>James Linn</author>   <author>Vaidyanathan Nagarajan</author>   <year>2003</year>   <price>49.99</price>   </book>  </bookstore>


    参考网址:点击打开链接