JDOM编程技术.docx

上传人:b****8 文档编号:30439614 上传时间:2023-08-15 格式:DOCX 页数:26 大小:75.22KB
下载 相关 举报
JDOM编程技术.docx_第1页
第1页 / 共26页
JDOM编程技术.docx_第2页
第2页 / 共26页
JDOM编程技术.docx_第3页
第3页 / 共26页
JDOM编程技术.docx_第4页
第4页 / 共26页
JDOM编程技术.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

JDOM编程技术.docx

《JDOM编程技术.docx》由会员分享,可在线阅读,更多相关《JDOM编程技术.docx(26页珍藏版)》请在冰豆网上搜索。

JDOM编程技术.docx

JDOM编程技术

JDOM编程

1、JDOM概述

(1)简介

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、创建、处理和序列化以及多种操作。

JDOM的处理方式是采用与DOM类似的树操作,JDOM是用java语言读、写、操作XML的新api函数(并且是一个开源的api)。

JDOM直接为JAVA编程服务。

它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SimpleAPIforXML(SAX)和DocumentObjectModel(DOM)的功能有效地结合起来。

JDOM在2000年的春天被BrettMcLaughlin和JasonHunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。

(2)JDOM的内部逻辑结构

基本上与DOM的相同,比如具有Document、Element、Comment等文档节点类型,其中每一个JDOM文档必须有一个Document节点,并且为节点树的根节点。

该根节点可以有子节点或者叶子节点如Comment、Text等。

JDOM文档中的每一个节点类型均对应格式良好的XML文当中的每一个元素。

(3)Jdom的设计原则

●第一条并且是最重要的一条就是jdom的api函数被设计成对java程序员来说是简单易懂的。

其他的XML解析函数被设计成语言通用的(在java,c++,甚至是javascript中支持相同的api函数)。

Jdom利用了java的优秀的特征,如:

方法重载、回收机制,和后台处理等。

为了能够简单易用,这些函数不得不以程序员喜欢的形式来描绘XML文档。

例如:

下面的XML内容

Thisismytextcontent

对上面的XML项目,在一些api中,元素的文本内容仅被当作是一个元素的孩子节点。

从技术角度来说,这个设计需要下面的代码才能访问到元素的内容:

Stringcontent=element.getFirstChild().getValue();

而在JDOM中使用一种更简单易用的方法来取得元素的内容:

Stringtext=element.getText();

●Jdom的第二条原则是说jdom应该是快速的和轻量级的。

调入和执行文档应该快速,内存的消耗应该尽量小。

2、为什么要求JDOM

(1)DOM和SAX的特性概述

已经有了DOM和SAX,那么,还需要jdom吗?

已经有了存在的标准,为什么还要去发明一个新的呢?

答案是jdom解决了现有的标准解决不了的问题。

DOM完全在内存中描述一个元素树。

它是一个大的api,被设计操作几乎所有可能的XML任务。

它也必须有相同的api去支持不同的语言。

因为这些限制,对那些习惯使用java的特征,如方法重载、简单的set,get方法的java程序员来说,就很不习惯。

DOM还需要大量的内存和较高的主频,这使它很难和许多轻量级的web应用一起工作。

SAX没有在内存中建立一个元素树,它用事件的方式来描述。

例如:

它报告每个读到的开始标记和结束标记。

这种处理方式使它成为一个轻量级的快速读取的api。

然而,这种事件处理方式对服务器端的java程序员来说不够直观。

SAX也不支持修改XML文档和随机读取。

Jdom试图组合DOM和SAX的优点。

它被设计成一个可以在小内存上快速执行轻量级api。

Jdom也支持随机读取整个文档,但是令人惊奇的是它并不需要把整个文档读到内存中。

这个api支持未来的当需要时才读入信息的次轻量级操作。

还有,Jdom通过标准的构造器和set方法支持XML文档的修改。

(2)JDOM的优点

根据JDOM的文档声明,我们将会很明显的看出应用JDOM的优势所在。

JDOM文档声明如下“JDOM引用了20/80原则,即使用20%的精力解决80%的JAVA/XML问题”。

●JDOM是用JAVA开发并为JAVA提供服务的,它沿用了JAVA代码的规范和类库;

●在众多编程语言中,JAVA是使用XML的优秀平台,XML又是JAVA应用的优秀数据表示方法。

JDOMAPI是纯JAVAAPI对于JAVA开发人员来说更容易上手;

●JDOMAPI比DOM所提供的方法更为直观,同时简化了与XML的交互,比使用DOM更快。

2、JDOM与SAX和DOM的比较

SAX不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。

DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。

JDOM可以和已有的XML技术如SAX和DOM相互协作。

然而,它并不是简单的从这些api中提取出一些。

Jdom从这些已存在的技术中吸收了好的方面,自己建立了一套新的类和接口;jdom可以读入SAX或是DOM的内容,也可以输出SAX或DOM可以接收的格式。

这个能力可以使jdom很好的和已有的用SAX或DOM建立的系统之间整合。

JDOM既有SAX在速度和性能上的优势,也跟DOM一样将文档读入内存,从整体上解析XML文档,特别他提供的操作数据节点的方法比DOM还要简洁。

3、获得并安装JDOM

在http:

//www.jdom.org可以下载JDOM的最新版本,下载后解压缩,JDOM的jar文件就是build目录下的文件jdom.jar,将之加入classpath类路径(下图显示出在JCreator中的Jdom包的设置)。

4、JDOM包概览

JDOM是由以下几个包组成的

org.JDOM、org.JDOM.input、org.JDOM.output、org.JDOM.adapters、org.JDOM.transform等

5、org.JDOM包的说明

●org.JDOM:

这个包里的类是你解析xml文件后所要用到的所有数据类型。

Attribute、CDATA、Coment、DocType、Document、Element、EntityRef、Namespace、ProscessingInstruction、Text。

这些类均是访问和操作JDOM文档所必须的。

我们可以利用这些类创建、遍历、修改JDOM文档。

●org.JDOM.transform:

在涉及xslt格式转换时应使用下面的2个类:

JDOMSource、JDOMResult

●org.JDOM.input:

输入类,一般用于XML文档的创建工作:

SAXBuilder、DOMBuilder、ResultSetBuilder

●org.JDOM.output:

输出类,用于将XML的文档转换为其它形式的输出:

XMLOutputter、SAXOutputter、DomOutputter、JTreeOutputter。

用于处理JDOM树的DOM树形式、XML文档形式输出、打印等。

6、用JDOMAPI生成XML文件的简单示例

(1)Java程序代码

importjava.io.*;

importorg.jdom.*;

importorg.jdom.input.*;

importorg.jdom.input.*;

importorg.jdom.output.*;

publicclassCreateXMLFileByJDOM

{

publicvoidBuildXMLDoc()throwsIOException,JDOMException

{

ElementdocRoot,tagName,childTagName;

DocumentxmlDoc;

//

(1)构造根节点并将根节点放入文档中

docRoot=newElement("人员信息");

xmlDoc=newDocument(docRoot);

//

(2)构造第一级子节点并设置该节点的属性和标签体的内容

tagName=newElement("姓名");

tagName.setText("张三");

tagName.setAttribute("ID","001");

docRoot.addContent(tagName);

//构造第二级子节点并设置该节点的标签体的内容

childTagName=newElement("籍贯");

childTagName.setText("北京");

tagName.addContent(childTagName);//在"姓名"下再添加一个子标签"籍贯"

//构造第一级子节点并设置该节点的标签体的内容

tagName=newElement("年龄");

tagName.setText("43");

docRoot.addContent(tagName);

//构造第一级子节点并设置该节点的标签体的内容

tagName=newElement("性别");

tagName.setText("男");

docRoot.addContent(tagName);

//(3)构造XML的输出流并设置该输出流的属性,最后输出到指定的XML文件中

XMLOutputterXMLOut=newXMLOutputter();

XMLOut.setIndent("");//设置子元素向右缩多少个空格

XMLOut.setNewlines(true);//设置回行标志

XMLOut.setEncoding("gb2312");

XMLOut.output(xmlDoc,newFileOutputStream("CreateXMLFileByJDOM.xml"));

}

publicstaticvoidmain(String[]args)

{

try

{

CreateXMLFileByJDOMxmlDocument=newCreateXMLFileByJDOM();

xmlDocument.BuildXMLDoc();

}

catch(Exceptione)

{

System.out.println(e.getMessage());

}

}

}

(2)执行该程序后将在当前目录下产生如下的文件为test1.xml的XML文件输出

xmlversion="1.0"encoding="gb2312"?

>

<人员信息>

<姓名ID="001">

张三

<籍贯>北京

<年龄>43

<性别>男

7、JDOM中的Ducument类主要使用方法

(1)Ducument类:

Document的操作方法:

Elementroot=newElement("GREETING");//创建根节点

Documentdoc=newDocument(root);//根据根节点来创建出XML文档

root.setText("HelloJDOM!

");//设置根节点的标签体文字串

注意:

●将产生如下的标签

HelloJDOM!

●或者简单地使用

Documentdoc=newDocument(newElement("GREETING").setText("HelloJDOM!

t"));

●这点和DOM不同。

Dom则需要更为复杂的代码,如下:

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

DocumentBuilderbuilder=factory.newDocumentBuilder();

Documentdoc=builder.newDocument();

Elementroot=doc.createElement("GREETING");

Texttext=doc.createText("HelloJDOM!

");

root.appendChild(text);

doc.appendChild(root);

(2)从文件、流、系统ID、URL得到Document对象,其中DOMBuilder类中的build()方法可以实现从DOM文档类创建出JDOM的文档:

SAXBuilderbuilder=newSAXBuilder();

Documentdoc=builder.build(newFile("jdom_test.xml"));

或者:

SAXBuilderbuilder=newSAXBuilder();

Documentdoc=builder.build(url);

(3)DOM的Document和JDOM的Document之间的相互转换使用方法

●将DOM的文档转换为JDOM的文档

DOMBuilderbuilder=newDOMBuilder();

org.jdom.DocumentjdomDocument=builder.build(domDocument);

●将JDOM转换为DOM,利用DOMOutputter类中的output()方法

DOMOutputterconverter=newDOMOutputter();

org.w3c.dom.DocumentdomDocument=converter.output(jdomDocument);

(4)XML文档输出:

●利用XMLOutPutter类来实现JDOM的输出是非常灵活的,并且支持很多种IO格式以及风格的输出。

try

{

Stringindent="";//空格

booleannewLines=true;//产生换行效果

XMLOutputteroutp=newXMLOutputter(indent,newLines,"GB2312");

outp.setTextTrim(true);//设置除掉前后的空格

outp.output(xmlDocument,newFileOutputStream(xmlFileName));

}//实现一般的文件方式的输出

catch(Exceptione)

{

System.out.println(e.toString());

}

●如果要求实现以socket形式的输出,则

outp.setTextTrim(true);

outp.output(xmlDocument,socket.getOutputStream());

●如果要求实现控制台形式的输出

outp.setIndent("");

outp.setNewlines(true);

outp.output(xmlDocument,System.out);

8、Element类:

(1)浏览Element树

Elementroot=doc.getRootElement();//获得根元素element

ListallChildren=root.getChildren();//获得所有子元素的一个list

ListnamedChildren=root.getChildren("name");//获得指定名称子元素的list

Elementchild=root.getChild("name");//获得指定名称的第一个子元素

(2)管理子元素

另外JDOM给了我们很多很灵活的使用方法来管理子元素

ListallChildren=root.getChildren();

allChildren.remove(3);//删除第四个子元素

allChildren.removeAll(root.getChildren("jack"));//删除叫“jack”的子元素

或者:

root.removeChildren("jack");//便捷写法

allChildren.add(newElement("jane"));//加入

或者:

root.addContent(newElement("jane"));//便捷写法

allChildren.add(0,newElement("first"));

(3)对Element的标签体的文字串内容读取

比如有如下的标签

Acooldemo

Stringdesc=element.getText();

或者:

Stringdesc=element.getTextTrim();

(4)对Elment的内容进行修改

element.setText("新的内容");

●可正确解释特殊字符

element.setText("content");

●CDATA的数据写入、读出

element.addContent(newCDATA("content").toString());

StringnoDifference=element.getText();

●混合内容

element可能包含很多种内容,比如说

--Somecomment-->

Sometext

Somechildelement

取table的子元素tr标签

Stringtext=table.getTextTrim();

Elementtr=table.getChild("tr");

或者:

也可使用另外一个比较简单的方法

ListmixedCo=table.getContent();

Iteratoritr=mixedCo.iterator();

while(itr.hasNext())

{

Objecto=i.next();

if(oinstanceofComment)

{

...

}

//这里可以写成Comment,Element,Text,CDATA,ProcessingInstruction,或者是EntityRef的类型

}

//现在移除Comment,注意这里游标应为1。

这是由于回车键也被解析成Text类的缘故,所以Comment项应为1。

mixedCo.remove

(1);

9、Attribute类

为例说明

(1)获得标签的指定名称的属性内容

Stringwidth=table.getAttributeValue("width");

intborder=table.getAttribute("width").getIntValue();

(2)设置指定名称的属性值

table.setAttribute("vspace","0");

(3)删除标签中的一个指定名称或全部属性

table.removeAttribute("vspace");

table.getAttributes().clear();

10、操作XML文件中的项目

(1)读取文档类型

许多XML文档都有的一个东西是文档类型,在jdom中用DocType类来描述。

一个文档类型的声明如下:

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"

"http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

DOCTYPE后边的第一个词揭示文档被强制类型的名字,PUBLIC后边的词是文档类型的公共属性,最后一个词是文档类型的系统属性。

文档属性可以通过文档的getDocType()方法获得,DocType类提供了一组获得文档类型声明的方法。

DocTypedocType=xmlDocument.getDocType();

System.out.println("Element:

"+docType.getElementName());

System.out.println("PublicID:

"+docType.getPublicID());

System.out.println("SystemID:

"+docType.getSystemID());

(2)访问子节点

XML文档是树型结构的,任何一个元素都有可能包含任何数量的子元素。

可以通过很多方法获得一个元素的子元素。

对getChild()而言,如果没有子元素的话将返回NULL。

ListgetChildren();//返回所有的子节点的列表

ListgetChildren(Stringname);//返回指定名称的节点下的所有的子节点的列表

ElementgetChild(Stringname);//返回指定名称的第一个子节点元素

示例:

●ListallChildren=element.getChildren();

out.println("Firstkid:

"+((Element)allChildren.get(0)).getName());

….

●ListnamedChildren=element.getChildren("name");

….

●Elementkid=element.getChild("name");

当文档结构事先知道的情况下,getchild()方法很容易快速的获得嵌套的元素。

给出一个XML文档的例:

xmlversion="1.0"?

>

config>

Enlightenment

0.16.2

--etc-->

config>

下边的代码直接获得window-manager的name名字的内容“Enlightenment”

StringwindowManager=rootElement.getChild("gui")

.getChild("window-manager").getChild("name").getText();

如果文档不可用要小心NullPointerExceptions异常。

为了实现简单的文档导航,未来的jdom可能会支持xpath。

子节点可以通过getParent()获得父节点。

(3)获取XML文档中某一标签的属性

●属性是标签元素拥有的另一组信息。

下边的

元素有width和border属性。

这些属性可以在标签元素中直接获得。

Stringwidth=table.getAttributeValue("width");

●也可

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1