XML 学习(二)
1.了解XML DOM
XML DOM 是 XML Document Object Model 的缩写,即 XML 文档对象模型。
XML DOM 是用于获取、更改、添加或删除 XML 元素的标准。
2.XML DOM 节点
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 文档。
例子:
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);
}
<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 />");
}
}
注释:
- 通过使用 loadXMLDoc() 把 "books.xml" 载入 xmlDoc 中
- 获得根元素的子节点
- 检查每个子节点的节点类型。如果节点类型是 "1",则是元素节点
- 如果是元素节点,则输出节点的名称
主要的节点类型:
元素类型 节点类型
元素 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 />");
}
}