JDOM与XML解.docx

上传人:b****7 文档编号:8801063 上传时间:2023-02-01 格式:DOCX 页数:15 大小:27.87KB
下载 相关 举报
JDOM与XML解.docx_第1页
第1页 / 共15页
JDOM与XML解.docx_第2页
第2页 / 共15页
JDOM与XML解.docx_第3页
第3页 / 共15页
JDOM与XML解.docx_第4页
第4页 / 共15页
JDOM与XML解.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

JDOM与XML解.docx

《JDOM与XML解.docx》由会员分享,可在线阅读,更多相关《JDOM与XML解.docx(15页珍藏版)》请在冰豆网上搜索。

JDOM与XML解.docx

JDOM与XML解

JDOM与XML详解

JDOM让XML在Java中比以前任何时候都容易使用

以前,可能使用一部分Java的一部分库类来操作XML数据结构。

那么,JDOM(JavaDocumentObjectModel)的要点又是什么,为什么开发人员需要它?

对Java-optimizedXML数据操作的JDOM是开放源代码。

虽然它很像WorldWideWeb联盟(W3C)的DOM,但是它是一个可供选择的对象模型,这个模型不是建立在DOM或者基于DOM的模型之上的。

主要的不同是DOM作为language-neutral建立并且用于HTML页面的JavaScript操作,JDOM作为Java-specific建立,因此具有了Java本身的优点,包括methodoverloading,collections,reflection,andfamiliar。

对于Java编程人员来说,JDOM倾向于探索更多的本身的能力和好处。

这个很象Java-optimizedRMI(remotemethodinvocation)库探索更多本身的能力,而不是象language-neutralCORBA(CommonObjectRequestBrokerArchitecture)那样。

在jdom.org上的开放代码Apache-style(commercial-friendly)版本中,可以找到JDOM。

它是协作设计、开发的产物,它拥有多达3,000多个志愿人员。

这个库同时也被Sun'sJavaCommunityProcess(JCP)作为JavaSpecificationRequest(JSR-102)接受,同时正在一步一步的成为一个正式的Java规范。

下面一系列的文章将针对JDOM提供技术说明。

文章提供了关于重要类的信息。

下篇文章将给一些关于怎样在的Java程序里面使用JDOM的内容。

 

JDOM包结构

JDOM库由六个包组成。

第一个org.jdom包支持包括了一个XML文档,同时包括:

Attribute,CDATA,Comment,DocType,Document,Element,EntityRef,Namespace,ProcessingInstruction,以及Text。

如果对XML很熟悉,类名将帮助理解类的含义。

下来的org.jdom.input包,它支持类用于建立XML文档。

最主要也是重要的类是SAXBuilder。

SAXBuilder通过监听输入简单的针对XML(SAX)事件的API建立文档。

当想从一个文件或者其它流来建立文档的时候,可以使用SAXBuilder。

它使用SAX分析器来读取流,然后依据SAX分析器的返回来建立文档。

这个设计的一个好的方面是分析器的工作越快,,SAXBuilder的工作也就越快。

另外一个主要的输入类是DOMBuilder。

DOMBuilder从DOM树建立。

这个类很容易从先前的DOM树中获得,而要一个JDOM版本代替。

对于设计人员是没有限制的。

例如:

现在Xerces要在比SAX低水平时操作XercesNativeInterface(XNI),它可以作出判断去做一个XNIBuilder来支持一些分析器的规则,不被SAX暴露。

ResultSetBuilder是一种受欢迎的人,他们投稿给JDOM工程。

这样让JDBC的更加坚固,并且建立了SQL的XML文档表达模式,包括了许多关于那些是组成部分那些是属性的配置。

org.jdom.outpu包支持类输出XML文档。

最重要的类是XMLOutputter。

它为了将文档输出到文件,流,以及sockets将其转化为字节流。

类XMLOutputter又很多奇特的配置选项来支持原始输出,恰当的输出,或者压缩输出以及其它方式。

它是一个相当复杂的类。

这也许就是为什么这个不在DOMLevel2存在的原因。

另外的输出包括了类SAXOupputter,它根据文档内容产生了SAX事件。

虽然表面上看很神秘,但是这个类在XSLT转换中是非常有用的,因为SAX事件比字节更有效传输文档数据。

这里同样有类DOMOutputter,它建立了DOM树文档表示。

一个有趣的设计是JTreeOutputter,它只有很少的一些代码,它建立了Jtree来文档表示。

用ResultSetBuilder联合,使用简单的代码,就可以完成SQL查询和队列遍历。

注意,不象DOM,开发人员不会将文档打包。

这就产生了一个模式,可以使用类保存数据,许多的类构造了数据,并且许多其它的类放弃了数据。

org.jdom.transform和org.jdom.xpath包的类支持建立XSLT转化和Xpath查找。

最后是org.jdom.adapters包中类支持在DOM内部进行交流。

库用户不需要访问这个库的类。

每个DOM执行过程都对每步任务有不同的方法名,所以适配器将标准调用转换为parser-specific调用。

JavaAPIforXMLProcessing(JAXP)对于这个问题给出其它的一些解决方法,实际上是对于类的需要,但是一些类仍然保留,因为不是所有的分析器都支持JAXP,或者JAXP不是任何地方都安装了,并且版本正确。

建立一个文档

文档由org.jdom.Documentclass来辅助建立。

可以象下面这样建立一个文档:

//Thisbuilds:

Documentdoc=newDocument(newElement("root"));

或者可以由一个文件,流,系统ID,或者URL建立文档:

//Thisbuildsadocumentofwhatever'sinthegivenresource

SAXBuilderbuilder=newSAXBuilder();

Documentdoc=builder.build(url);

在JDOM中将一些调用组合在一起,可以很容易的建立一个简单的文档:

//Thisbuilds:

Thisistheroot

Documentdoc=newDocument();

Elemente=newElement("root");

e.setText("Thisistheroot");

doc.addContent(e);

如果是个有经验的用户,或许可以使用"methodchaining,",在有多个方法的时候依次被调用。

因为固定的方法返回产生的对象。

如下:

Documentdoc=newDocument(

 newElement("root").setText("Thisistheroot"));

作为比较,这里给出如何使用JAXP/DOM建立同样的文档:

//JAXP/DOM

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

DocumentBuilderbuilder=factory.newDocumentBuilder();

Documentdoc=builder.newDocument();

Elementroot=doc.createElement("root");

Texttext=doc.createText("Thisistheroot");

root.appendChild(text);

doc.appendChild(root);

用SAXBuilder建立

早期,SAXBuilder建立了一个可以从任何byte-oriented资源建立文档的机制。

默认的SAXBuilder()在后台使用JAXP选择SAX剖析器。

如果要改变剖析器,可以设置javax.xml.parsers.SAXParserFactory系统特性指向SAXParserFactory,由的剖析器保证运行。

对于Oracle9iRelease2XML剖析器,可以这样使用:

java-Djavax.xml.parsers.SAXParserFactory=

oracle.xml.jaxp.JXSAXParserFactoryYourApp

对于Xerces剖析器,可以这样来代替:

java-Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp

.SAXParserFactoryImplYourApp

如果没有安装JAXP,SAXBuilder默认为ApacheXerces。

一旦建立一个SAXBuilder实例,就可以设置一些道具,包括:

setValidation(booleanvalidate)

这个方法在建立中告诉剖析器针对DocumentTypeDefinition(DTD)是否有效。

默认是关闭的。

使用DTD是关于文档的DocType的一个参考。

针对其它DTD是不可能有效的,因为没有剖析器支持这个能力。

setIgnoringElementContentWhitespace(booleanignoring)

这个方法告诉剖析器是否忽视调用whitespace的元素目录。

每个XML1.0说明,在元素目录中的whitespace必须剖析器保存,但是针对一个DTD确认需要确认剖析器知道某些文档的部分没有被声明支持whitespace,则任何在那个区域的whitespace都是"ignorable."这个默认是关闭的。

这个对于部分存储并不是最好的,除非要"roundtrip"一个文档,并且将输入作为输出。

注意,这个标记只有确认打开时是激活的,而且确认使得执行速度减慢,所以最好在确认已经使用的情况下再使用。

setFeature(Stringname,Stringvalue)

这个方法再SAX剖析器的后台做一些设置。

这是个无处理的传递调用,所以要非常小心的使用,因为设置错误(例如tweakingnamespaces)将会毁坏JDOM。

此外,依靠任何parser-specific都有一定的便捷性。

这个调用对于计划确认的授权很有用。

setProperty(Stringname,Objectvalue)

这个方法再SAX剖析器的后台做一些设置。

这同样是个无处理的传递调用,对于高级用户同时拥有了高危险性和很高的适用性,特别针对于计划确认。

将方法组合,下面的代码在确认打开同时忽视ignorablewhitespace的情况下,使用JAXP-selected剖析器读取当地文件。

SAXBuilderbuilder=newSAXBuilder();

builder.setValidation(true);

builder.setIgnoringElementContentWhitespace(true);

Documentdoc=builder.build(newFile("/tmp/foo.xml"));

通过XMLOutputter建立文档

一个文档可以以多种格式输出,但是最常用的是字节流。

在JDOM中,XMLOutputter类提供了这种特性。

默认的构造器试图无错误的输出在内存中存储的文档。

下面的代码提供了针对文件原始的表示。

//Rawoutput

XMLOutputteroutp=newXMLOutputter();

outp.output(doc,fileStream);

如果担心whitespace,可以清除空白:

//Compressedoutput

outp.setTextTrim(true);

outp.output(doc,socketStream);

如果要打印出人们习惯的样式,可以添加缩进的空白并且换到新行:

outp.setTextTrim(true);

outp.setIndent(" ");

outp.setNewlines(true);

outp.output(doc,System.out);

当打印一个已经格式化空白的文档,需要确认是可以清理的。

否则,必须格式化,这可能很难看。

操作元素树

JDOM让操作元素树很容易。

得到根部元素:

Elementroot=doc.getRootElement();

Togetalistofallitschildelements:

ListallChildren=root.getChildren();

通过名字得到指定元素:

ListnamedChildren=root.getChildren("name");

根据给定名得到第一个元素:

Elementchild=root.getChild("name");

getChildren()调用返回的List是一个java.util.List,一个所有Java程序员都知道的List接口操作。

列表的活动性很有趣。

任何List的改变将会在后台的文档中显示出来。

//Removethefourthchild

allChildren.remove(3);

//Removechildrennamed"jack"

allChildren.removeAll(root.getChildren("jack"));

//Addanewchild,atthetailoratthehead

allChildren.add(newElement("jane"));

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

使用List意味着不需要添加众多的方法就可以进行多个元素的操作。

为了方便,无论是在最后添加元素还是删除已命名的元素,元素本身都拥有了相应的方法,则不需要在操作之前获得List:

root.removeChildren("jill");

root.addContent(newElement("jenny"));

JDOM的一个优点是它可以很容易在文档内部或者在文档之间移动元素。

代码都是一样的:

 

Elementmovable=newElement("movable");

parent1.addContent(movable);   //place

parent1.removeContent(movable);//remove

parent2.addContent(movable);   //add

使用DOM,移动元素是不容易的,因为在DOM中,元素是和建立工具绑定的。

因而,DOM元素在文档之间移动必须是有关系的"imported"。

关于JDOM有一件必须注意的就是移动元素之前先要添加,所以你不能建立一个循环树。

有个detach()方法可以分离/添加一条线:

parent3.addContent(movable.detach());

如果在添加一个元素到另外一个父接点之前忘记了分离它,库将会抛出一个异常。

库也会检查元素的名字和内容,确认它们不包括不适当的字符,就像空白。

它同样还有其它的规则,例如只有一个根元素,相容的名字空间声明,注释和CDATA部分里面没有被禁止的字符序列,等等。

这种特性使得在进程中尽可能早的去检查"well-formedness"错误变成可能。

操作元素属性

元素属性:

..。

对于元素,可以用命名属性值任何名字:

Stringval=table.getAttributeValue("width");

对于执行特殊的操作,例如类型变化,也可以作为对象得到属性:

 

Attributeborder=table.getAttribute("border");

intsize=border.getIntValue();

使用setAttribute()设置或者改变属性:

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

使用removeAttribute()删除一个属性:

 

table.removeAttribute("vspace");

关于文本内容的处理

元素文本内容就像:

 Acooldemo

在JDOM中,文本直接可以被调用使用:

Stringdesc=description.getText();

只要注意,因为XML1.0规范需要空白被保存,返回"\nAcooldemo\n"。

当然,作为实际编程人员经常的不想面对空白的格式,所以当忽视了周围的空白的时有了简单的方法:

StringbetterDesc=description.getTextTrim();

如果需要空白在图片外,需要getTextNormalize()方法规格化空白。

对于文本内容是很便利的:

 Sometimesyouhavetextcontentwithformatting

 spacewithinthestring.

通过setText()方法改变文本内容:

description.setText("Anewdescription");

文本里面的任何特殊字符都被相应的字符解释,并且空格在输出中有了恰当的意义。

例如:

element.setText("content");

内部存储以字符保存文字串。

torewillkeepthatliteralstringascharacters。

不需要盲目的对内容分解。

在输出时:

content

这些行为保持了早期setText()调用的语义。

如果需要XML在一个元素内被支持,必须添加适当的JDOM子元素对象。

JDOM同样可以处理CDATA部分。

一个CDATA部分需要的一个text文本不需要被分析。

它包括了简单一些HTML和XML内容,不含有以及空格。

建立一个CDATA部分,只要用CDATA对象包裹字符串:

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

混和内容的行为

一些元素包括了很多的内容,例如whitespace,comments,text,childelements,等等:

 

--Somecomment-->

 Sometext

 

Somechildelement

当一个元素包括了文本和子元素,被称为混和内容。

处理混和内容本来是很困难的,但是通过JDOM变得简单。

标准的应用-找回文本内容和遍历元素-很简单:

Stringtext=table.getTextTrim(); //"Sometext"

Elementtr=table.getChild("tr"); //Astraightreference

对于大多数高级用户,都需要注释,空白,处理说明和实体参考,未处理的混和文本作为List是可行的:

ListmixedCo=table.getContent();

Iteratoritr=mixedCo.iterator();

while(itr.hasNext()){

 Objecto=i.next();

 if(oinstanceofComment){

   ...

 }

 //TypesincludeComment,Element,CDATA,DocType,

 //ProcessingInstruction,EntityRef,andText

}

作为子元素列表,改变原始列表影响了后台文档:

//RemovetheComment。

It's"1"because"0"isawhitespaceblock.

mixedCo.remove

(1);

更多关于DocType,ProcessingInstruction,和EntityRefclasses的细节可以在jdom.org上的API文档中找到。

 

ORACLEXML工具

XMLDeveloperKit(XDK)是免费的XML工具库,它是有Oracle提供给开发人员的。

它包括了XML剖析器和一个XSLT翻译引擎,能和JDOM使用。

在OracleXML主页上,你可以找到更多的信息关于这些工具,

下载剖析器,寻找名为"XDKforJava."的XMLDeveloperKit。

在左边的专栏点击"Software"来找到下载连接。

一旦你打开分类,文件xalparserv2.jar就包括了剖析器。

使用剖析器的默认来配置JDOM和其它软件,你需要设置JAXPjavax.xml.parsers.SAXParserFactory系统为oracle.xml.jax.JXSAXParserFactory。

这将告诉JAXP选择了Oracle剖析器。

简单的方法是在命令行输入:

[CODE]java-Djavax.xml.parsers.SAXParserFactory=

oracle.xml.jaxp.JXSAXParserFactory

同样可以设定:

System.setProperty("jaxax.xml.parsers.SAXParserFactory","oracle.xml.jaxp.JXSAXParserFactory");

除了XDK之外,Oracle提供了原先的XMLOracle9iDatabaseRelease2仓库。

Oracle9iXMLDatabase(XDB)是应用很多,本身的XML存储。

它充分的吸收了W3CXML在Oracle9iDatabase中的数据模式并且为XML遍历和查询提供了新的标准接入方法。

关于XDB,得到了数据库相关的优点以及XML技术的优点。

用命名空间进行工作

JDOM为XML命名空间提供了丰富的,本地支持。

在命名空间发布之后JDOM才被发布。

在JDOM中,命名空间是通过Namespace类来描述的:

Namespacexhtml=Namespace.getNamespace(

 "xhtml","http:

//www.w3.org/1999/xhtml";);

通过构造,一个对象被赋予了一个名字并且能随意的给一个命名空间:

elt.addContent(newElement("table",xhtml));

如果没有给出的命名空间,被构造的元素将没有命名空间。

一个元素的命名空间是它类型的本质的一部分,所以JDOM确保元素移动到文档的其它位置命名空间将不能被更改。

如果一个元素没有命名空间并且移动到一个有命名空间的元素之下,它不继承命名空间。

有时这将造成混淆,直到你学习了将textual描述从语义结构中分离

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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