JDOM使用详解及实例作者:佚名文章来源:不详点击数:61更新时间:2006-2-22一、JDOM简介JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。JDOM在2000年的春天被BrettMcLaughlin和JasonHunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。JDOM的最新版本为JDOMBeta9。最近JDOM被收录到JSR-102内,这标志着JDOM成为了JAVA平台组成的一部分。二、JDOM包概览JDOM是由以下几个包组成的org.jdom包含了所有的xml文档要素的java类org.jdom.adapters包含了与dom适配的java类org.jdom.filter包含了xml文档的过滤器类org.jdom.input包含了读取xml文档的类org.jdom.output包含了写入xml文档的类org.jdom.transform包含了将jdomxml文档接口转换为其他xml文档接口org.jdom.xpath包含了对xml文档xpath操作的类三、JDOM类说明1、org.JDOM这个包里的类是你J解析xml文件后所要用到的所有数据类型。AttributeCDATAComentDocTypeDocumentElementEntityRefNamespaceProscessingInstructionText2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类JDOMSourceJDOMResultorg.JDOM.input3、输入类,一般用于文档的创建工作SAXBuilderDOMBuilderResultSetBuilderorg.JDOM.output4、输出类,用于文档转换输出XMLOutputterSAXOutputterDomOutputterJTreeOutputter使用前注意事项:1.JDOM对于JAXP以及TRax的支持JDOM支持JAXP1.1:你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。制定特别的parser可用如下形式SAXBuilderparser=newSAXBuilder(org.apache.crimson.parser.XMLReaderImpl);Documentdoc=parser.build();//workwiththedocument...JDOM也支持TRaX:XSLT可通过JDOMSource以及JDOMResult类来转换(参见以后章节)2.注意在JDOM里文档(Document)类由org.JDOM.Document来表示。这要与org.w3c.dom中的Document区别开,这2种格式如何转换在后面会说明。以下如无特指均指JDOM里的Document。四、JDOM主要使用方法1.Ducument类(1)Document的操作方法:Elementroot=newElement(GREETING);Documentdoc=newDocument(root);root.setText(HelloJDOM!);或者简单的使用Documentdoc=newDocument(newElement(GREETING).setText(HelloJDOM!t));这点和DOM不同。Dom则需要更为复杂的代码,如下:DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdoc=builder.newDocument();Elementroot=doc.createElement(root);Texttext=doc.createText(Thisistheroot);root.appendChild(text);doc.appendChild(root);注意事项:JDOM不允许同一个节点同时被2个或多个文档相关联,要在第2个文档中使用原来老文档中的节点的话。首先需要使用detach()把这个节点分开来。(2)从文件、流、系统ID、URL得到Document对象:DOMBuilderbuilder=newDOMBuilder();Documentdoc=builder.build(newFile(jdom_test.xml));SAXBuilderbuilder=newSAXBuilder();Documentdoc=builder.build(url);在新版本中DOMBuilder已经Deprecated掉DOMBuilder.builder(url),用SAX效率会比较快。这里举一个小例子,为了简单起见,使用String对象直接作为xml数据源:publicjdomTest(){StringtextXml=null;textXml=note;textXml=textXml+toaaa/tofrombbb/fromheadingccc/headingbodyddd/body;textXml=textXml+/note;SAXBuilderbuilder=newSAXBuilder();Documentdoc=null;Readerin=newStringReader(textXml);try{doc=builder.build(in);Elementroot=doc.getRootElement();Listls=root.getChildren();//注意此处取出的是root节点下面的一层的Element集合for(Iteratoriter=ls.iterator();iter.hasNext();){Elementel=(Element)iter.next();if(el.getName().equals(to)){System.out.println(el.getText());}}}catch(IOExceptionex){ex.printStackTrace();}catch(JDOMExceptionex){ex.printStackTrace();}}(3)DOM的document和JDOM的Document之间的相互转换使用方法,简单!DOMBuilderbuilder=newDOMBuilder();org.jdom.DocumentjdomDocument=builder.build(domDocument);DOMOutputterconverter=newDOMOutputter();//workwiththeJDOMdocument…org.w3c.dom.DocumentdomDocument=converter.output(jdomDocument);//workwiththeDOMdocument…2.XML文档输出XMLOutPutter类:JDOM的输出非常灵活,支持很多种io格式以及风格的输出Documentdoc=newDocument(...);XMLOutputteroutp=newXMLOutputter();outp.output(doc,fileOutputStream);//Rawoutputoutp.setTextTrim(true);//Compressedoutputoutp.output(doc,socket.getOutputStream());outp.setIndent();//Prettyoutputoutp.setNewlines(true);outp.output(doc,System.out);详细请参阅最新的JDOMAPI手册3.Element类:(1)浏览Element树Elementroot=doc.getRootElement();//获得根元素elementListallChildren=root.getChildren();//获得所有子元素的一个listListnamedChildren=root.getChildren(name);//获得指定名称子元素的listElementchild=root.getChild(name);//获得指定名称的第一个子元素JDOM给了我们很多很灵活的使用方法来管理子元素(这里的List是java.util.List)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));(2)移动Elements:在JDOM里很简单Elementmovable=newElement(movable);parent1.addContent(movable);//placeparent1.removeContent(movable);//removeparent2.addContent(movable);//add在Dom里Elementmovable=doc1.createElement(movable);parent1.appendChild(movable);//placeparent1.removeChild(movable);//removeparent2.appendChild(movable);//出错!补充:纠错性JDOM的Element构造函数(以及它的其他函数)会检查element是否合法。而它的add/remove方法会检查树结构,检查内容如下:1.在任何树中是否有回环节点2.是否只有一个根节点3.是否有一致的命名空间(Namespaces)(3)Element的text内容读取descriptionAcooldemo/description//Thetextisdirectlyavailable//Returns\nAcooldemo\nStringdesc=element.getText();//There'saconvenientshortcut//ReturnsAcooldemoStringdesc=element.getTextTrim();(4)Elment内容修改element.setText(Anewdescription);3.可正确解释特殊字符element.setText(xmlcontent);4.CDATA的数据写入、读出element.addContent(newCDATA(xmlcontent));StringnoDifference=element.getText();混合内容element可能包含很多种内容,比如说table!--Somecomment--SometexttrSomechil