您的位置:首页 > 其它

DOM的四个基本接口

2009-08-25 19:00 323 查看
在DOM接口规范中,有四个基本的接口:DocumentNodeNodeList以及NamedNodeMap。在这四个基本接口中, Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,象Documet,Element, Attribute,Text,Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子 节点。NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。 下面将对这四个接口分别做一些简单的介绍。

Document接口
Document接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了对文档中的数据进行访问和操作的入口。

由于元素文本节点注释处理指令等都不能脱离文档的上下文关系而独立存在,所以在Document接口提供了创建其他节点对象的方法,通过该方法创建 的节点对象都有一个ownerDocument属性,用来表明当前节点是由谁所创建的以及节点同Document之间的联系。

Document节点是DOM树中的根节点,也即对XML文档进行操作的入口节点。通过Docuemt节点,可以访问到文档中的其他节点, 如处理指令、注释、文档类型以及XML文档的根元素节点等等。另外,从上图我们还可以看出,在一棵DOM树中,Document节点可以包含多个处理指 令、多个注释作为其子节点,而文档类型节点XML文档根元素节点都是唯一的。

Node接口
Node接口在整个DOM树中具有举足轻重的地位,DOM接口中有很大一部分接口是从Node接口继承过来的,例如,Element、Attr、 CDATASection等接口,都是从Node继承过来的。在DOM树中,Node接口代表了树中的一个节点,提供了访问DOM树中元素内容与信息的途径,并给出了对DOM树中的元素进行遍历的支持。

NodeList接口
NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。另外,它还出现在一些方法的返回值中,例如getNodeByName()。

在DOM中,NodeList的对象是"live"的,换句话说,对文档的改变,会直接反映到相关的NodeList对象中。例如,如果通过DOM获得一 个NodeList对象,该对象中包含了某个Element节点的所有子节点的集合,那么,当再通过DOM对Element节点进行操作(添加、删除、改 动节点中的子节点)时,这些改变将会自动地反映到NodeList对象中,而不需DOM应用程序再做其他额外的操作。

NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。

NamedNodeMap接口
实现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集合。不过注意,NamedNodeMap并不是从NodeList继 承过来的,它所包含的节点集中的节点是无序的。尽管这些节点也可以通过索引来进行访问,但这只是提供了枚举NamedNodeMap中所包含节点的一种简 单方法,并不表明在DOM规范中为NamedNodeMap中的节点规定了一种排列顺序。

NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上。与NodeList相同,在DOM中,NamedNodeMap对象也是"live"的。

一个简单的例子:

Java文件

package XML;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DOMStudentsInfo
{
public void readXML(String file)
{
//创建一个DOM工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//打印值为:com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
System.out.println(dbf.getClass().getName());
try
{
//通过DOM工厂实例创建一个DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();

//通过DOM工厂将xml文件解析,并放入doc中
Document doc = db.parse(new File(file));

//获得student的所有节点信息
NodeList nl = doc.getElementsByTagName("student");

//获得student节点个数
int len = nl.getLength();
for(int i=0;i<len;i++)
{
Element eltStu = (Element)nl.item(i);
Node eltName = eltStu.getElementsByTagName("name").item(0);
Node eltAge = eltStu.getElementsByTagName("age").item(0);

String name = eltName.getFirstChild().getNodeValue();
String age = eltAge.getFirstChild().getNodeValue();
System.out.println("name:"+name);
System.out.println("age:"+age);
System.out.println("-------------------------------");
}
}
catch (ParserConfigurationException e)
{
e.printStackTrace();
}
catch (SAXException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}

public static void main(String[] args)
{
DOMStudentsInfo ds = new DOMStudentsInfo();
ds.readXML("./XML/students.xml");
}
}

XML文件:

<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?>

<students>
<student sn="01">
<name>张三</name>
<age>18</age>
</student>
<student sn="02">
<name>李四</name>
<age>24</age>
</student>
</students>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: