JDOM编程技术.docx
《JDOM编程技术.docx》由会员分享,可在线阅读,更多相关《JDOM编程技术.docx(26页珍藏版)》请在冰豆网上搜索。
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文档中某一标签的属性
●属性是标签元素拥有的另一组信息。
下边的
这些属性可以在标签元素中直接获得。
Stringwidth=table.getAttributeValue("width");
●也可