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 的属性节点
定位一个节点包括三种方式:
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 是属性的值
如何得到节点下面的属性值:
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>
参考网址:点击打开链接
- XML学习记录之XML-DOM
- XML学习之DOM解析
- Java使用Dom解析xml学习记录
- Java学习之---DOM解析XML
- XML学习之Dom方式解析XML文件
- XML入门学习笔记之XML解析技术---DOM解析
- XML DOM 学习总结!
- XML DOM学习
- 解析xml之--DOM
- xml解析之Dom
- XML解析之 DOM
- XML解析之Dom
- XML解析之DOM
- XML解析之Dom
- XML解析之DOM
- 解析XML之DOM
- xml之dom解析
- xml解析之dom
- Android系统在超级终端下必会的命令大全
- android常用烧录命令
- Android应用程序键盘(Keyboard)消息处理机制分析(三)
- 合并排序算法
- .Net开发人员常犯的6大安全错误
- XML学习记录之XML-DOM
- 工作那些事
- ORACLE函数大全
- o.boj 1066 SPOJ
- Android应用程序键盘(Keyboard)消息处理机制分析(四)
- 关于Ubuntu给新手的配置
- SEO学习资源
- vim常用操作
- rep repe repz repnz scasb scasw学习