XML学习记录之XML-DOM

 解析 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>


    参考网址:点击打开链接

     

     

     

     

     

     

     

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值