一些比较实用的软件教材

XML 学习(二)

1.了解XML DOM

XML DOM 是 XML Document Object Model 的缩写,即 XML 文档对象模型。

XML DOM 是用于获取、更改、添加或删除 XML 元素的标准。

2.XML DOM 节点

XML文档中的每个成分都是一个节点。

  • 整个文档是一个文档节点
  • 每个XML标签是一个元素节点
  • 包含在XML元素中的文本是文本节点
  • 每个XML属性是一个属性节点
  • 注释属于注释节点 


 

XML例子
 1 <?xml version="1.0" encoding="ISO-8859-1"?>
2
3 <bookstore>
4
5 <book category="children">
6 <title lang="en">Harry Potter</title>
7 <author>J K. Rowling</author>
8 <year>2005</year>
9 <price>29.99</price>
10 </book>
11
12 <book category="cooking">
13 <title lang="en">Everyday Italian</title>
14 <author>Giada De Laurentiis</author>
15 <year>2005</year>
16 <price>30.00</price>
17 </book>
18
19 <book category="web">
20 <title lang="en">Learning XML</title>
21 <author>Erik T. Ray</author>
22 <year>2003</year>
23 <price>39.95</price>
24 </book>
25
26 <book category="web">
27 <title lang="en">XQuery Kick Start</title>
28 <author>James McGovern</author>
29 <author>Per Bothner</author>
30 <author>Kurt Cagle</author>
31 <author>James Linn</author>
32 <author>Vaidyanathan Nagarajan</author>
33 <year>2003</year>
34 <price>49.99</price>
35 </book>
36
37 </bookstore>


注意:元素节点不包含文本,不过元素节点中的文本时储存在文本节点中的

例如:

<year>2005</year>,元素节点 <year>,拥有一个值为 "2005" 的文本节点。

 

"2005" 不是 <year> 元素的值!

3.加载、解析XML DOM

xml文件要以DOM的方式加载在浏览器中,然后通过浏览器中解析,浏览。

各大浏览器水深火热的厮杀,互不相让,因此我们这些开发人员伤不起啊!

DOM的解析,在各个浏览器中的解析方法也各不相同!

还好,思路都基本相同:

 

  • 创建空的 XML 文档对象
  • 关闭异步加载,这样可确保在文档完整加载之前,解析器不会继续执行脚本
  • 告知解析器加载 xml文档或者字符串

微软解析器加载xml的方法:

xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("xml路径");

载入字符串:

 

xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);

火狐或者其他浏览器载入xml的方法:

 

xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";
xmlDoc.load("books.xml");

载入字符串:

<!--创建一个空的 XML 文档对象-->
parser=new DOMParser();
<!--告知解析器加载名为 txt 的字符串-->
xmlDoc=parser.parseFromString(txt,"text/xml");

注释:Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 DOMParser 对象

当然我们也可以将微软个火狐的方法合在一块,实现跨域访问

代码如下:

 

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

4.XML DOM 属性和方法

 

属性经常按照“某事物是什么”的方式来使用(例如节点名是 "book")。

 

方法经常按照“对某事物做什么”的方式来使用(例如删除 "book" 节点)。

XML DOM属性:

 

  • x.nodeName - x 的名称
  • x.nodeValue - x 的值
  • x.parentNode - x 的父节点
  • x.childNodes - x 的子节点
  • x.attributes - x 的属性节点
  • x.length - x 的属性节点列表的长度(即节点的数目)

       firstChild: 表示第一个子节点

       lastChild:表示最后一个子节点

       nextSibling:表示某节点的上下一个节点

       previousSibling:表示某节点的上一个节点

XML DOM 方法:

  • x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素
  • x.appendChild(node) - 向 x 插入子节点
  • x.removeChild(node) - 从 x 删除子节点

注释:在上面的列表中,x 是一个节点对象。
为了避免因加载文档而重复编写代码,可以加载xml文件的方法的代码存储在一个单独的 JavaScript 文件中,

然后连接一个连接指向javascript文件,并使用 loadXMLDoc() 函数加载 XML 文档。

例子:

封装加载xml
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);
}
调用封装的js
<html>
<head>
<!--指向封装的加载xml的js-->
<script type="text/javascript" src="loadxmldoc.js">
</script>
</head>
<body>
<script type="text/javascript">
<!--loadXMLDoc() 函数加载 XML 文档-->
xmlDoc=loadXMLDoc("books.xml");
document.write("xmlDoc is loaded, ready for use");
</script>
</body>
</html>


遍历节点:

 

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
/>");
}
}

注释:

 

  1. 通过使用 loadXMLDoc() 把 "books.xml" 载入 xmlDoc 中
  2. 获得根元素的子节点
  3. 检查每个子节点的节点类型。如果节点类型是 "1",则是元素节点
  4. 如果是元素节点,则输出节点的名称

主要的节点类型:

元素类型    节点类型

 元素             1

 属性             2

 文本             3

 注释             8

 文档             9

可以参见《DOM节点类型

注意:getElementsByTagName() 方法返回节点列表 (node list)。节点列表是节点的数组。
5.XML DOM 浏览器差异

在xml中空白和换行是被保留的,所以对dom来说,空白和换行也被认为是一个节点,

忽略节点间的空文本

 

xmlDoc=loadXMLDoc("books.xml");

x=xmlDoc.documentElement.childNodes;

for (i=0;i<x.length;i++)
{
if (x[i].nodeType
==1)
{// only process element nodes
document.write(x[i].nodeName);
document.write("<br
/>");
}
}






 

posted @ 2012-03-29 18:06  子灏  阅读(957)  评论(0编辑  收藏  举报

传说中的阿里云服务