JDOM 介绍及使用指南1

JDOM是一种使用XML的独特Java工具包,用于快速开发XML应用程序。它的设计包含Java语言的语法乃至语义。

JDOM是两位著名的Java开发人员兼作者,BrettMclaughlin和JasonHunter的创作成果,2000年初在类似于Apache协议的许可下,JDOM作为一个开放源代码项目正式开始研发,JDOM作为一个开放源代码项目正式开始了。它已成长为包含来自广泛的Java开发人员的投稿、集中反馈及错误修复的系统,并致力于建立一个完整的基于Java平台的解决方案,通过Java代码来访问、操作并输出XML数据。
  虽然许多Java开发人员每天都在使用XML,Sun却在将XML整合进Java平台方面落后了。因为在XML成为从商家对商家集成到Web站点内容流水化等方面的关键技术之前,Java2平台就已经非常流行了。Sun已经使用JSR过程使之成为现存XMLAPI的鼻祖,这一点已被广泛接受。目前最显著的是加入了JAXP(用于XML语法分析的JavaAPI),其中包含了三个软件包:
  ·org.w3c.dom,W3C推荐的用于XML标准规划文档对象模型的Java工具
  ·org.xml.sax,用于对XML进行语法分析的事件驱动的简单API
  ·javax.xml.parsers,工厂化工具,允许应用程序开发人员获得并配置特殊的语法分析器工具JDOM能够替换org.w3c.dom软件包来有计划地操作XML文档
  JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。
  JDOM直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。
  Jdom是用Java语言读、写、操作XML的新API函数。JasonHunter和BrettMcLaughlin公开发布了它的1.0版本。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。
  在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。
  JDOM在2000年的春天被BrettMcLaughlin和JasonHunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。
  这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。
  DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。JDOM的最新版本为JDOMBeta9。最近JDOM被收录到JSR-102内,这标志着JDOM成为了JAVA平台组成的一部分。
  在JDOM中,XML元素就是Element的实例,XML属性就是Attribute的实例,XML文档本身就是Document的实例。
  因为JDOM对象就是像Document、Element和Attribute这些类的直接实例,因此创建一个新JDOM对象就如在Java语言中使用new操作符一样容易。JDOM的使用是直截了当的。
  JDOM使用标准的Java编码模式。只要有可能,它使用Javanew操作符而不故弄玄虚使用复杂的工厂化模式,使对象操作即便对于初学用户也很方便。
  一、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文件后所要用到的所有数据类型。
  Attribute
  CDATA
  Coment
  DocType
  Document
  Element
  EntityRef
  Namespace
  ProscessingInstruction
  Text
  2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类
  JDOMSource
  JDOMResult
  org.JDOM.input
  3、输入类,一般用于文档的创建工作
  SAXBuilder
  DOMBuilder
  ResultSetBuilder
  4、org.JDOM.output输出类,用于文档转换输出
  XMLOutputter
  SAXOutputter
  DomOutputter
  JTreeOutputter
  使用前注意事项:
  1.JDOM对于JAXP以及TRax的支持
  JDOM支持JAXP1.1:你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。
  制定特别的parser可用如下形式
  SAXBuilderparser
  =newSAXBuilder("org.apache.crimson.parser.XMLReaderImpl");
  Documentdoc=parser.build("http://www.cafeconleche.org/");
  //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="";
  textXml=textXml+
  "aaabbbcccddd";
  textXml=textXml+"";
  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);//Rawoutput
  outp.setTextTrim(true);//Compressedoutput
  outp.output(doc,socket.getOutputStream());
  outp.setIndent("");//Prettyoutput
  outp.setNewlines(true);
  outp.output(doc,System.out);
  详细请参阅最新的JDOMAPI手册
  3.Element类:
  (1)浏览Element树
  Elementroot=doc.getRootElement();//获得根元素element
  ListallChildren=root.getChildren();//获得所有子元素的一个list
  ListnamedChildren=root.getChildren("name");//获得指定名称子元素的list
  Elementchild=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);//place
  parent1.removeContent(movable);//remove
  parent2.addContent(movable);//add
  在Dom里
  Elementmovable=doc1.createElement("movable");
  parent1.appendChild(movable);//place
  parent1.removeChild(movable);//remove
  parent2.appendChild(movable);//出错!
  补充:纠错性
  JDOM的Element构造函数(以及它的其他函数)会检查element是否合法。
  而它的add/remove方法会检查树结构,检查内容如下:
  1.在任何树中是否有回环节点
  2.是否只有一个根节点
  3.是否有一致的命名空间(Namespaces)
  (3)Element的text内容读取
  Acooldemo
  //Thetextisdirectlyavailable
  //Returns"/nAcooldemo/n"
  Stringdesc=element.getText();
  //There'saconvenientshortcut
  //Returns"Acooldemo"
  Stringdesc=element.getTextTrim();
  (4)Elment内容修改
  element.setText("Anewdescription");
  3.可正确解释特殊字符
  element.setText("
  四、JDOM的应用
  (一)、XML文档创建
  我们由零开始利用JDOM生成一个XML文档。最后的结果(样本文档)看起来象这样:
  kingwong
  87654321
  1.以MyInfo为根元素创建文档
  ElementrootElement=newElement("MyInfo");//所有的XML元素都是Element的实例。根元素也不例外:)
  DocumentmyDocument=newDocument(rootElement);//以根元素作为参数创建Document对象。一个Document只有一个根,即root元素。
  2.给根元素添加属性
  AttributerootAttri=newAttribute("comment","introducemyself");//创建名为commnet,值为introducemyself的属性。
  rootElement.setAttribute(rootAttri);//将刚创建的属性添加到根元素。
  这两行代码你也可以合成一行来写,象这样:
  rootElement.setAttribute(newAttribute("comment","introducemyself"));
  或者
  rootElement.setAttribute("comment","introducemyself");
  3.添加元素和子元素
  JDOM里子元素是作为content(内容)添加到父元素里面去的,所谓content就是类似上面样本文档中之间的东东,即kingwong。啰嗦了点是吧:)
  ElementnameElement=newElement("name");//创建name元素
  nameElement.addContent("kingwong");//将kingwong作为content添加到name元素
  rootElement.addContent(nameElement);//将name元素作为content添加到根元素
  这三行你也可以合为一句,象这样:
  rootElement.addContent((Content)(newElement("name").addContent("kingwong")));//因为addContent(Contentchild)方法返回的是一个Parent接口,而Element类同时继承了Content类和实现了Parent接口,所以我们把它造型成Content。
  我们用同样的方法添加带属性的子元素
  rootElement.addContent(newElement("sex").setAttribute("value","male"));//注意这里不需要转型,因为addAttribute(Stringname,Stringvalue)返回值就是一个Element。
  同样的,我们添加元素到根元素下,用法上一样,只是稍微复杂了一些:
  rootElement.addContent((Content)(newElement("contact").addContent((Content)(newElement("telephone").addContent("87654321")))));
  如果你对这种简写形式还不太习惯,你完全可以分步来做,就象本节刚开始的时候一样。事实上如果层次比较多,写成分步的形式更清晰些,也不容易出错。
  4.删除子元素
  这个操作比较简单:
  rootElement.removeChild("sex");//该方法返回一个布尔值
  到目前为止,我们学习了一下JDOM文档生成操作。上面建立了一个样本文档,可是我们怎么知道对不对呢?因此需要输出来看一下。我们将JDOM生成的文档输出到控制台,使用JDOM的XMLOutputter类。
  5.将JDOM转化为XML文本
  XMLOutputterxmlOut=newXMLOutputter("",true);
  try{
  xmlOut.output(myDocument,System.out);
  }catch(IOExceptione){
  e.printStackTrace();
  }
  XMLOutputter有几个格式选项。这里我们已指定希望子元素从父元素缩进两个空格,并且希望元素间有空行。
  newXMLOutputter(java.lang.Stringindent,booleannewlines)这个方法在最新版本中已经不建议使用。JDOM有一个专门的用来定义格式化输出的类:org.jdom.output.Format,如果你没有特殊的要求,有时候使用里面的几个静态方法(应该可以说是预定义格式)如getPrettyFormat()就可以了。我们把上面的输出格式稍微改一下,就象这样:
  XMLOutputterxmlOut=newXMLOutputter(Format.getPrettyFormat());
  6.将JDOM文档转化为其他形式
  XMLOutputter还可输出到Writer或OutputStream。为了输出JDOM文档到一个文本文件,我们可以这样做:
  FileWriterwriter=newFileWriter("/some/directory/myFile.xml");
  outputter.output(myDocument,writer);
  writer.close();
  XMLOutputter还可输出到字符串,以便程序后面进行再处理:
  StrngoutString=xmlOut.outputString(myDocument);
  当然,在输出的时候你不一定要输出所有的整个文档,你可以选择元素进行输出:
  xmlOut.output(rootElement.getChild("name"),System.out);
  一句话,JDOM非常灵活方便!如果你想进一步研究JDOM,请到官方网站去看一看:http://www.jdom.org
  本节示例源码:
  packagecom.cyberobject.study;
  importjava.io.IOException;
  importorg.jdom.Attribute;
  importorg.jdom.Content;
  importorg.jdom.Document;
  importorg.jdom.Element;
  importorg.jdom.output.Format;
  importorg.jdom.output.XMLOutputter;
  /**
  *@authorkingwong
  *
  *TODOTochangethetemplateforthisgeneratedtypecommentgoto
  *Window-Preferences-Java-CodeStyle-CodeTemplates
  */
  publicclassTestJDOM{
  publicstaticvoidmain(String[]args)
  {
  ElementrootElement=newElement("MyInfo");
  DocumentmyDocument=newDocument(rootElement);
  //AttributerootAttri=newAttribute("comment","introducemyself");
  //rootElement.setAttribute(rootAttri);
  rootElement.setAttribute("comment","introducemyself");
  //rootElement.setAttribute(newAttribute("comment","introducemyself"));
  //ElementsexElement=newElement("sex");
  //rootElement.addContent(sexElement);
  //ElementnameElement=newElement("name");
  //nameElement.addContent("kingwong");
  //rootElement.addContent(nameElement);
  rootElement.addContent((Content)(newElement("name").addContent("kingwong")));
  rootElement.addContent(newElement("sex").setAttribute("value","male"));
  rootElement.addContent((Content)(newElement("contract").addContent((Content)(newElement("telephone").addContent("87654321")))));
  rootElement.removeChild("sex");
  XMLOutputterxmlOut=newXMLOutputter(Format.getPrettyFormat());
  try{
  xmlOut.output(myDocument,System.out);
  //xmlOut.output(rootElement.getChild("name"),System.out);
  //StringoutString=xmlOut.outputString(myDocument);
  }catch(IOExceptione){
  e.printStackTrace();
  }
  }
  }
  (二)、XML文档解析
  JDOM不光可以很方便的建立XML文档,它的另一个用处是它能够读取并操作现有的XML数据。
  JDOM的解析器在org.jdom.input.*这个包里,其中的DOMBuilder的功能是将DOM模型的Document解析成JDOM模型的Document;SAXBuilder的功能是从文件或流中解析出符合JDOM模型的XML树。由于我们经常要从一个文件里读取数据,因此我们应该采用后者作为解析工具。
  解析一个xml文档,基本可以看成以下几个步骤:
  1.实例化一个合适的解析器对象
  本例中我们使用SAXBuilder:
  SAXBuildersb=newSAXBuilder();
  2.以包含XML数据的文件为参数,构建一个文档对象myDocument
  DocumentmyDocument=sb.build(/some/directory/myFile.xml);
  3.获到根元素
  ElementrootElement=myDocument.getRootElement();
  一旦你获取了根元素,你就可以很方便地对它下面的子元素进行操作了,下面对Element对象的一些常用方法作一下简单说明:
  getChild("childname")返回指定名字的子节点,如果同一级有多个同名子节点,则只返回第一个;如果没有返回null值。
  getChildren("childname")返回指定名字的子节点List集合。这样你就可以遍历所有的同一级同名子节点。
  getAttributeValue("name")返回指定属性名字的值。如果没有该属性则返回null,有该属性但是值为空,则返回空字符串。
  getChildText("childname")返回指定子节点的内容文本值。
  getText()返回该元素的内容文本值。
  还有其他没有罗列出来的方法,如果需要的话,可以随时查阅JDOM的在线文档:http://www.jdom.org/docs/apidocs/index.html。当然你可以在你需要的地方添加、删除元素操作,还记得上面的创建XML的方法吗?呵呵~~~
  学习新东东还是从实例学起最为快捷,下面简单举个例子,就以上面的XML样本代码来学习JDOM的XML解析。本例中读取了样本XML文件里一些属性和content,最后我们还在contact元素里插入了一个新元素wanghua@cyberobject.com"/>。尽管我们实现了对于XML的基本操作,细心的朋友可能会
  有疑问:如果XML文档的层次稍微复杂一些,如果嵌套多达几十上百层的话(开个玩笑),如果靠这样从根元素一级一级地通过getChild("childname")来访问子元素的话,将会非常痛苦!是的,的确是这样,但是我们有另一个有力的工具XPath,为什么不用呢?这是后话!先卖个关子(手敲累啦,下回吧,呵呵)。
  /*
  *Createdon2004-8-21
  *
  *TODOTochangethetemplateforthisgeneratedfilegoto
  *Window-Preferences-Java-CodeStyle-CodeTemplates
  */
  packagecom.cyberobject.study;
  importorg.jdom.Document;
  importorg.jdom.Element;
  importorg.jdom.input.SAXBuilder;
  importorg.jdom.output.Format;
  importorg.jdom.output.XMLOutputter;
  /**
  *@authorkingwong
  *
  *TODOTochangethetemplateforthisgeneratedtypecommentgoto
  *Window-Preferences-Java-CodeStyle-CodeTemplates
  */
  publicclassTestJDOM2{
  publicstaticvoidmain(String[]args){
  SAXBuildersb=newSAXBuilder();
  try
  {
  Documentdoc=sb.build("myFile.xml");
  Elementroot=doc.getRootElement();
  Stringstr1=root.getAttributeValue("comment");
  System.out.println("RootElement'scommentattributeis:"+str1);
  Stringstr2=root.getChild("sex").getAttributeValue("value");
  System.out.println("sexElement'svalueattributeis:"+str2);
  Stringstr3=root.getChildText("name");
  System.out.println("nameElement'scontentis:"+str3);
  Stringstr4=root.getChild("contact").getChildText("telephone");
  System.out.println("contactElement'stelephonesubelementcontentis:"+str4+"/n");
  ElementinputElement=root.getChild("contact");
  inputElement.addContent(newElement("email").setAttribute("value","wanghua@cyberobject.com"));
  XMLOutputterxmlOut=newXMLOutputter(Format.getPrettyFormat());
  StringoutStr=xmlOut.outputString(root);
  System.out.println(outStr);
  }
  catch(Exceptione)
  {
  e.printStackTrace();
  }
  }
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、JDOM 简介 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。 在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。 JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。 这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。 DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。JDOM的最新版本为JDOM Beta 9。最近JDOM被收录到JSR-102内,这标志着JDOM成为了JAVA平台组成的一部分。 二、JDOM 概览 JDOM是由以下几个组成的 org.jdom 含了所有的xml文档要素的javaorg.jdom.adapters 含了与dom适配的javaorg.jdom.filter 含了xml文档的过滤器类 org.jdom.input 含了读取xml文档的类 org.jdom.output 含了写入xml文档的类 org.jdom.transform 含了将jdom xml文档接口转换为其他xml文档接口 org.jdom.xpath 含了对xml文档xpath操作的类三、JDOM 类说明 1、org.JDOM这个里的类是你J解析xml文件后所要用到的所有数据类型。 Attribute CDATA Coment DocType Document Element EntityRef Namespace ProscessingInstruction Text 2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类 JDOMSource JDOMResult org.JDOM.input 3、输入类,一般用于文档的创建工作 SAXBuilder DOMBuilder ResultSetBuilder org.JDOM.output 4、输出类,用于文档转换输出 XMLOutputter SAXOutputter DomOutputter JTreeOutputter 使用前注意事项: .........
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值