2024年3月5日发(作者:)

DOM 编程技术

1、Sun JAXP技术

目前很多厂商如SUN、IBM等都发布了自己的支持XML的API,其中SUN公司提供了一个支持在Java下使用XML的API-JAXP(JAVATM API for XML Processing Optional Package),这部分API提供了基本的读写、操作XML文档的功能,通过它我们可以很方便的将XML集成到Java应用程序中来。

JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可以和具体实现DOM

API、SAX API 的各种XML解析器(XML Parser,例如Apache Xerces)联合工作,又可以和具体执行XSLT标准的XSLT处理器(XSLT Processor,例如Apache Xalan)联合工作。

应用Pluggability Layer的好处在于:我们只需要熟悉JAXP各个编程接口的定义即可,而不需要对所采用的具体的XML解析器、XSLT处理器有很深入的了解。比如在某个Java程序中,通过JAXP调用XML解析器Apache Crimson对XML文档进行处理,如果我们希望使用别的XML解析器(比如Apache Xerces),以便提高该程序的性能,那么原程序代码可能不需要任何改变,直接就可以使用(你所需要做的事情只是将包含Apache Xerces代码的jar文件加入到环境变量CLASSPATH中,而将包含Apache Crimson代码的jar文件在环境变量CLASSPATH中删除)。

在Java程序中通过SUN公司的API-JAXP可以实现和XML的交互,具体实现主要有两种方法,一种是采用DOM2 API,另外一种是采用SAX2 API。

2、DOM 概述

DOM全称是document object model(文档对象模型),通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML文档的内容。

DOM是一种详细描述HTML/XML文档对象规则的API,DOM解释器是由W3C官方制定的标准解释器Api,只要符合该标准的编程接口都可以用来操作XML。它规定了HTML/XML文档对象的命名协定,程序模型,沟通规则等。在XML文档中,我们可以将每一个标识元素看作一个对象---它有自己的名称和属性。

XML创建了标识,而DOM的作用就是告诉Script脚本如何在浏览器窗口中操作和显示这些标识。

DOM规范与Web世界的其他标准一样受到W3C组织的管理,在其控制下为多重平台和语言使用DOM提供一致的API,W3C把DOM定义为一套抽象的类而非正式实现DOM。

因此可以选择任何满足DOM的解释器所提供的编程接口所实现的应用程序.将会很方便的移植到其他实现了DOM编程接口的平台工作。

3、DOM 节点树

DOM把文档表示为节点(Node)对象树。 “树”这种结构定义为一套互相联系的对象的集合,或者说节点,其中一个节点作为树结构的根(root)。节点被冠以相应的名称以对应它们在树里相对其他节点的位置。例如,某一节点的父节点就是树层次内比它高一级别的节点(更靠近根元素),而其子节点则比它低一级别;兄弟节点显然就是树结构中与它同级的节点了——不在它的左边就在它的右边。

天博培训机构 Http://

4、DOM内部逻辑结构

(1)DOM文档中的逻辑结构可以用节点树的形式进行表述。通过对XML文件的解析处理,XML文件中的元素便转化为DOM文档中的节点对象。

(2)DOM的文档节点有Document、Element、Comment、Type等等节点类型,其中每一个DOM文档必须有一个Document节点,并且为节点树的根节点。它可以有子节点,或者叶子节点如Text节点、Comment节点等。

(3)任何的格式良好的XML文件中的每一个元素均有DOM文档中的一个节点类型与之对应。利用DOM接口将XML文件转化成DOM文档后,就可以自由的处理XML文件了。

举例来说,属性结点总是和一个元素结点相关联,而用来封装元素的起始标记和结束标记中的文本是映射到一个文本结点的。文本结点是元素结点的一个子节点。所以,即使很简单的XML文件的表现也可能会需要很多种节点类型。

5、Java中的DOM接口

(1)文件

目前在jdk1.4版中的Java API遵循了 DOM level 2 Core推荐接口的语义说明,提供了相应的java语言的实现。具体在C:文件中

 在包中,jkd1.4提供了Document、DocumentType、Node、NodeList、Element、Text等接口,这些接口均是访问DOM文档所必须的。我们可以利用这些接口创建、遍历、修改DOM文档。

 在s包中,jkd1.4提供的DoumentBuilder和DocumentBuilderFactory组合可以对XML文件进行解析,转换成DOM文档。

在和包中,jdk1.4提供了DOMSource类和StreamSource类,可以用来将更新后的DOM文档写入生成的XML文件中。

天博培训机构 Http://

(2)XML解释器的类型

基本上可以分为:

 验证和非验证解析器

 支持一种或多种 XML Schema 语言的解析器

 支持 Document Object Model (DOM) 的解析器

 支持 Simple API for XML (SAX) 的解析器

(3)DOM所提供的对象和方法---Document对象

该对象所描述的是整个XML文档。也就是整个树。对于树而言它可以表示为包含了很多节点的整体对象,而这些节点统称为Node。

Document对象代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。

Document对象中所包含的主要的方法有:

 createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。

 createElement(String):用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。

 createTextNode(String):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。 getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。

getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。

(4)DOM所提供的对象和方法--- Node对象

node是一个相对抽象的概念,因此在java的定义中node被描述为接口。在该接口的基础上扩展了如下几个子接口:

 Element:表示文档中的元素

 Attribute:表示XML文件中的属性

 Text:表示节点中的文字

 其他的节点类型包括:Comment 表示 XML 文件中的注释、ProcessingInstruction 表示处理指令、CDATASection 表示 CDATA 节。

注意:在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如Element、Attr、Text等Node对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点,这一点是要注意的。

Node对象所包含的主要的方法有:

 appendChild():为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。

 getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。

 getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。

 getNodeName():根据节点的类型返回节点的名称。

 getNodeType():返回节点的类型。

 getNodeValue():返回节点的值。

 hasChildNodes():判断是不是存在有子节点。

天博培训机构 Http://

 hasAttributes():判断这个节点是否存在有属性。

 getOwnerDocument():返回节点所处的Document对象。

 insertBefore( new, ref):在给定的一个子对象前再插入一个子对象。

 removeChild():删除给定的子节点对象。

 replaceChild( new, old):用一个新的Node对象代替给定的子节点对象。

(5)DOM所提供的对象和方法--- Element对象

它代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面进行使用。

常用的方法:

 getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。

注意:由于XML文档中的空白符也会被作为对象映射在DOM树中。因而,直接调用Node方法的getChildNodes方法有时候会有些问题,有时不能够返回所期望的NodeList对象。解决的办法是使用Element的getElementByTagName(String),返回的NodeLise就是所期待的对象了。然后,可以用item()方法提取想要的元素。

 getTagName():返回一个代表这个标签名字的字符串。

 getAttribute(String):返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。

 getAttributeNode(String):返回一个代表给定属性名称的Attr对象。

(6)DOM所提供的对象和方法--- Attr对象

它代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOM中Attr并不是DOM树的一部分,所以Node中的getparentNode(),getpreviousSibling()和getnextSibling()等方法对Attr对象而言将返回的都将是null。

也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别。

它所包含的主要的方法有:

createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。

(7)处理 DOM 经常要用到以下方法:

 umentElement():返回 DOM 树的根。

 stChild() 和 tChild():返回给定 Node 的第一个和最后一个子节点。

 tSibling() 和 viousSibling():返回给定 Node 的下一个和上一个兄弟节点。

 ribute(String attrName):对于给定的 Element,返回名为 attrName 的属性的值。如果需要 "id" 属性的值,可以使用 ribute("id")。如果该属性不存在,该方法返回一个空字符串 ("")。

6、简单的DOM示例

(1)通过DOM读取XML文档的内容编程步骤

 通过DocumentBulderFoctory创建XML解释器

 通过解释器创建一个可以加载并生成XML的DocumentBuilder

天博培训机构 Http://

 通过DocumentBuilder加载并生成一颗XML树,Document对象的实例

 通过Document可以遍历这颗树,并读取相应节点中的内容

(2)将XML文件转化成DOM文档的代码示例

这个过程是获得一个XML文件解析器,解析XML文件转化成DOM文档的过程。在Jdk1.4中,Document接口描述了对应于整个XML文件的文档树,提供了对文档数据的访问。Document接口可以从类DocumentBuilder中获取,该类包含了从XML文档获得DOM文档实例的API。

XML的解析器可以从类DocumentBuilderFactory中获取。在jdk1.4中,XML文件转化成DOM文档可以有如下代码实现:

Document domDocument;

public Document getDomFromXMLFile(String xmlFileName) throws

ParserConfigurationException,SAXException,IOException

{ //获得一个XML文件的解析器,解析XML文件生成DOM文档的接口类,以便访问DOM。

DocumentBuilderFactory factory = tance();

DocumentBuilder builder = umentBuilder();

domDocument = ( new File(xmlFileName) );

/*

对Document对象调用normalize(),可以去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象;否则你得到的DOM树可能并不如你所想象的那样。特别是在输出的时候,这个normalize()更为有用。

*/

ize();

return domDocument;

}

注意:下面对上面的代码进行解释

 首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象

DocumentBuilderFactory factory = tance();

我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序(由这个工厂负责加载XML解释器.这样使得程序员脱离了具体的编程环境,无需知道有关解释器的相关信息),当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。

 当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。

DocumentBuilder提供了创建XML文档的方法,通过这个对象,也使得程序无需和底层I/O系统打叫道,并且该对象会通过解释器生成正确的XML文档树。这样XML就被装载到了内存并生成了正确的树格式,但具体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要。

DocumentBuilder builder = umentBuilder();

 然后,我们就可以利用这个解析器来对XML文档进行解析了:

domDocument = ( new File(xmlFileName) );

DocumentBuilder的parse()方法接受一个XML文件名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了。

 在生成一个Document对象时的ParserConfigurationException异常、转换Node节点成字符串时要生成一个Transformer对象时的TransformerConfigurationException异常,这些异常通常是系统环境配置有问题(比如必要的DOM实现解析器等包没有加入环境)。

天博培训机构 Http://

(3)实现显示输出XML文档中各个标签的程序代码---请见文件

import s.*;

import .*;

public class DOMExample

{

public static void main(String[] args)throws Exception

{

DocumentBuilderFactory factory=tance();

DocumentBuilder bulider=umentBuilder();

Document doc=(“”);

NodeList nodeList=mentsByTagName(“XMLDataRoot”);

for(int index=0;index

{

Element node=(Element)(index);

n(“title is :” +

mentsByTagName(“title”).item(0).getFirstChild().getNodeValue().trim()); n(“author is :” +

mentsByTagName(“author”).item(0).getFirstChild().getNodeValue().trim()); n(“email is :” +

mentsByTagName(“email”).item(0).getFirstChild().getNodeValue().trim()); n(“date is :” +

mentsByTagName(“date”).item(0).getFirstChild().getNodeValue().trim()+”nn”);

}

}

}

7、遍历DOM文档

(1)获得接口类document实例后,可以对DOM的文档树进行访问。要遍历DOM文档,首先要获得Root元素。然后获得Root元素的子节点列表。这里通过递归的方法实现遍历的目的。

如下的XML节点:

text

在拥有element节点对象时,要获取其中的文本信息”text”,首先要获取element节点的子节点列表,要判断其是否存在子节点,如果存在,那么遍历其子节点找到一个TextNode节点,通过getNodeValue()方法来获取该文本信息,由于这里element节点没有信息时没有子节点,所以必须判断element节点是否存在子节点才能去访问真正包含了文本信息的TextNode节点。

(2)代码示例(请见)

Element element = umentElement(); //获得Root元素

NodeList nodelist = ldNodes(); //获得Root元素的子节点列表

GetElement(nodelist);

天博培训机构 Http://

其中GetElement方法实现如下:

public void GetElement(NodeList nodelist)

{

Node cnode;

int index;

String nodeTextStr;

if(gth() == 0)

{

n(“该节点没有子节点”);

return;

}

for(index=0;index< gth();index++)

{

cnode = (index);

if(eType() == 1) // 为Node类型的节点

{

n(eName());

GetElement(ldNodes());

}

else if(eType() == 3) // 为Text类型的节点,标签内的文字

{

nodeTextStr = eValue();

if(() > 1)

{ // 当该对象不为空时显示信息

n(nodeTextStr);

}

}

}

}

8、修改DOM文档

(1)概述

修改DOM文档的API在DOM level 2 Core规范中做了说明,jkd1.4中的中实现了这些API。修改DOM文档操作主要集中在Document、Element、Node、Text等类中。

(2)程序说明

 createXXX()方法:无论什么类型的Node,Text型的也好,Attr型的也好,Element型的也好,它们的创建都是通过Document对象中的createXXX()方法来创建的(XXX代表具体要创建的类型),因此,我们要向XML文档中添加一个“COMPUTES”项目,首先要创建一个Element 类型的booktype对象。

 createTextNode()方法:但需要注意的是,对Element中所包含的text(在DOM中,这些text也是代表了一个Node的,因此也必须为它们创建相应的node),不能直接用Element对象的setNodeValue()方法来设置这些text的内容,而需要用createTextNode()方法来创建该Text对象的方式来设置文本,这样才能够把创建的Element和其文本内容添加到DOM树中。

 最后,不要忘记把创建好的节点添加到DOM树中。Document类的getDocumentElement()方法,返回代表文档根节点的Element对象

(3)程序代码

这里给出的例子中是在解析出的DOM文档中增加一系列对象,对应与在XML文件中增加一条记录。

天博培训机构 Http://

Public void changeXMLDocument(Document domDocument)

{

Element root = umentElement(); // 获得Root对象

Element booktype = Element(“COMPUTES”);

// 在DOM文档中增加一个Element节点(为标签节点)

Child(booktype); //在根节点中增加一个booktype子节点

Element booktitle = Element(“Title”);

//在DOM文档中增加一个Element节点(为标签体的子节点)

Child(booktitle); //将该booktitle节点转化成booktype对象的子节点

Text bookname = TextNode(“Master XML “);

//在标签节点中增加一个Text节点,它代表该标签的文字内容

Child(bookname);

//将该bookname节点转化成booktitle对象的子节点

/*

必须将所修改后的XML数据写入到XML文件后,才能看到运行后的结果为:

Master XML

*/

}

9、 获得指定名称的节点的各个属性

(1)某一个XML文件的数据如下所示:

(2)程序说明

在使用Document对象的getElementsByTagName(“标签元素的名称”)方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,观其名而知其意,所代表的是一个Node对象的列表。比如针对如下的XML文档:

Hello Java And XML!

则:

NodeList messageTag = mentsByTagName(“message”);

我们通过这样一条语句所得到的是XML文档中所有标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item(int index)方法来得到列表中的每一个Node对象:

Node someNode = (0);

当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法:

String message = stChild().getNodeValue();

注意:

这里使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirseChild()方法,这主要天博培训机构 Http://

和W3C对DOM的定义有关。

W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使用getNodeValue()来获取文本的内容。

(3)程序代码

public void getNode(Document domDocument,String nodeName)

{

/*

由于在XML文档中的空白符也会被作为对象映射在DOM树中。因而,直接调用Node方法的getChildNodes方法有时候会有些问题,有时不能够返回所期望的NodeList对象。解决的办法是使用Element的getElementsByTagName(String),返回的NodeLise就是所期待的对象了

*/

NodeList nodeList =mentsByTagName(nodeName);

for (int I=0;I

{

Element node=(Element) (i);

String strAtrNameValue=ributeNode(“name”).getNodeValue();

String strAtrPassWordValue=ributeNode(“password”).getNodeValue();

String strAtrRoleValue=ributeNode(“roles”).getNodeValue();

n(“name的属性=”+strAtrNameValue+”,password的属性=”+strAtrPassWordValue+”,roles的属性=”+strAtrRoleValue);

}

}

(4)调用该方法

e(domDocument,”user”); //user为的节点名称

(5)执行的结果

注意:利用该特性,可以在xml文件中存储一些配置数据,在程序中获得该配置数据。然后根据配置数据进行不同的行为。

10、将DOM文档转化成XML文件

(1)概述

在JAXP1.1版本中,引入了对XSLT的支持,所谓XSLT,就是对XML文档进行变换(Translation)后,得到一个新的文档结构。利用JAXP1.1版本中这个新增加的功能,我们就能够很方便的把新生成或者修改后的DOM树重新写回到XML文件中去了。

(2)相应的Java 包:新引入的orm包中的几个类,就是用来处理XSLT变换的。

import orm.*;

import rce;

import Result;

(3)程序说明

天博培训机构 Http://

TransformerFactory也同样应用了工厂模式,使得具体的代码同具体的变换器无关。实现的方法和DocumentBuilderFactory相同。

Transformer类的transfrom方法接受两个参数、一个数据源Source和一个输出目标Result。这里分别使用的是DOMSource和StreamResult,这样就能够把DOM的内容输出到一个输出流中,当这个输出流是一个文件的时候,DOM的内容就被写入到文件中去了。

(4)程序代码

public void getXMLFileFromDOM(Document domDocument,String targetXMLFileName) throws

TransformerConfigurationException,TransformerException

{

//(1)创建出一个转换器工厂类的对象

TransformerFactory tfactory = tance();

//(2)创建出一个转换器对象

Transformer transformer = nsformer();

/*

*/

//(3)创建出一个Properties属性类的对象并设置其属性项目以产生XML的文档头

ties properties = putProperties();

perty(NG, "gb2312");

perty(, "xml");

perty(N, "1.0");

perty(, "no");

putProperties(properties);

//(4) 将DOM对象转化为DOMSource类对象,该对象表现为转化成别的表达形式的信息容器。

DOMSource domSource = new DOMSource(domDocument);

//(5)获得一个StreamResult类对象,该对象是DOM文档转化成的其他形式的文档的容器,可以是XML文件,文本文件,HTML文件。这里为一个XML文件。

StreamResult streamResult = new StreamResult(new File(targetXMLFileName));

// (6)调用API,将DOM文档转化成XML文件。

orm(domSource,streamResult);

}

11、DOM应用例

例1:修改一个XML格式的文件,然后将修改后的结果保存为另一个XML文件(请见文件)

import s.*;

import rce;

import Result;

import orm.*;

import .*;

public class ModifyXmlByDOM

{

public static void main(String[] args)throws Exception

{

Element book,bookName, bookAuthor,bookISBN,bookPrice;

DocumentBuilderFactory factory=tance();

DocumentBuilder builder=umentBuilder();

Document domDocument=(“”);

天博培训机构 Http://

//插入

book=Element(“Book”);

ribute(“id”,”4”);

bookName=Element(“bookName”);

Child(TextNode(“J2EE Programme begin Book”));

Child(bookName);

bookAuthor=Element(“bookAuthor”);

Child(TextNode(“Hesj”));

Child(bookAuthor);

bookISBN=Element(“bookISBN”);

Child(TextNode(“7-145-10241-3”));

Child(bookISBN);

bookPrice=Element(“bookPrice”);

Child(TextNode(“77.8”));

Child(bookPrice);

Element root = umentElement();

Child(book);

/*

//删除

// Child(book);

*/

/*

//修改

NodeList allBook=mentsByTagName(“Book”);

Element opBook=null;

for(int I=0;I

{

opBook=(Element)(i);

String id=ribute(“id”);

if((“4”))

{

break;

}

}

mentsByTagName(“bookAuthor”).item(0).getFirstChild().setNodeValue(“Bluce”);

*/

TransformerFactory tfactory=tance();

Transformer transformer=nsformer();

天博培训机构 Http://

ties properties = putProperties();

perty(NG, “gb2312”); //缺省为UTF-8

perty(, “xml”);

perty(N, “1.0”);

perty(, “no”);

putProperties(properties);

DOMSource domSource=new DOMSource(domDocument);

StreamResult streamResult=new StreamResult();

/*

如果要求写入到XML文件中,应该采用如下的方法

StreamResult streamResult = new StreamResult(new File(“”));

如果要求写入到浏览器中,应该采用如下的方法

StreamResult streamResult = new StreamResult(ter());

*/

orm(domSource,streamResult);

}

}

执行的结果为:

例2:解析XML配置文件中的各个配置项目例

(1)

天博培训机构 Http://

(2)

XML知识简介

总述

XML的历史

XML的未来

(3)解析XML配置文件的Java程序

import s.*;

import .*;

import .*;

import .*;

public class DOMParserDemo

{

static Document document;

static String indent = " ";

public static void main(String argv[])

{ //DOM解释器的API总类,用它来创建DOM解释器

DocumentBuilderFactory factory = tance();

try

{ DocumentBuilder builder = umentBuilder(); //创建DOM解释器

document = ( new File("") ); //取得XML的内容结构树

Element root = umentElement(); //取得结构树的根节点

NodeList nodeList = mentsByTagName("slide"); //取得标识为"slide"的集合

for(int i = 0; i < gth(); ++i) //使用循环访问每一张幻灯片

{

Element slide = (Element)(i); //取得slide节点

n("第" + (i+1) + "张幻灯片");

String slideType = ribute("type"); //取得属性的数据

(indent + "属性=" + slideType);

String title = mentsByTagName("title").item(0).getFirstChild().getNodeValue();

//取得标题的数据

天博培训机构 Http://

(",标题=" + title);

NodeList items = mentsByTagName("item");//取得内容(item)的数据,由于item标签有多个

for(int j = 0; j < gth(); ++j)

{

Element aItem = (Element)(j);

String strItem = "空值";

try

{

strItem = stChild().getNodeValue();

}

catch(Exception e)

{

}

(",内容" + (j+1) + "=" + strItem);

}

//在新的一行显示下一张幻灯片

n("");

}

}

catch (SAXException sxe)

{

Exception x = sxe;

if (eption() != null) x = eption();

tackTrace();

}

catch (ParserConfigurationException pce)

{

tackTrace();

}

catch (IOException ioe)

{

tackTrace();

}

}

}

(4)执行的结果

例3:编程构造一个XML的树数据,然后保存到xml文件中(请见文件)

import s.*;

天博培训机构 Http://

import .*;

import .*;

import rce;

import Result;

import orm.*;

public class WriteDomToXml

{

public static void main(String[] args)throws Exception

{

DocumentBuilderFactory factory=tance();

DocumentBuilder builder=umentBuilder();

Document domDocument=ument();

Element books=Element(“Books”);

Element book=Element(“Book”);

ribute(“id”,”001”);

Child(TextNode(“XML 编程技术”));

Child(book);

Child(books);

TransformerFactory tfactory=tance();

Transformer transformer=nsformer();

ties properties = putProperties();

perty(NG, “gb2312”); //缺省为UTF-8

perty(, “xml”);

perty(N, “1.0”);

perty(, “no”);

putProperties(properties);

DOMSource domSource=new DOMSource(domDocument);

StreamResult streamResult=new StreamResult();

/*

如果要求写入到XML文件中,应该采用如下的方法

StreamResult streamResult = new StreamResult(new File(“”));

*/

orm(domSource,streamResult);

}

}

执行的结果:

天博培训机构 Http://

例3:请见程序文件,根据XML数据生成对应的节点树

天博培训机构 Http://