`
skyj129
  • 浏览: 12888 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

jdom详细解释

阅读更多

此篇文章引用于http://jetway.iteye.com/blog/467719

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

 

 

JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初,JDOM作为一个开放源代码项目正式开始研发。JDOM是一种解析XML的Java工具包。

 

DOM适合于当今流行的各种语言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。它了为HTML和XML文档提供了一个可应用于不同平台的编程接口。W3C DOM的最新信息可从http://www.w3.org/TR2001/WD-DOM-Lever-3-Core-20010913查阅。微软在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmconxmldomuserguide.asp上也有DOM的详细技术信息。

 

DOM的设计为了适用于不同的语言,它保留了不同语言中非常相似的API。但是它并不适合于Java编程者的习惯。而JDOM作为一种轻量级API被制定,它最核心的要求是以Java为中心,只适合于Java语言,它遵循DOM的接口主要规则,除去了DOM中为了兼容各语言而与Java习惯的不同。

 

二、使用JDOM的前提条件

须要有SAX、DOM解析器的类文件,JDOM只是一种适合Java程序员来使用的Java XML解析器,目前流行的Java XML解析器还有:Apache Xerces Java、JAXP。

Xerces Java解析器是完全用Java编写的XML解析器,最新版本是2.5,它支持以下标准和API:

(1) XML1.0规范(第二版本)

(2) XML命名空间规范

(3) DOM2核心标准规范

(4) SAX2核心扩展

(5) JAXP1.2 :是Sun提供的使用Java处理XML的接口API。

(6) XML Schema结构和数据类型标准

 

还有最好的是它开放源代码,我们可以在http://xml.apache.org/dist/xerces-j/ 处去下载。下载文件Xerces-J-bin.2.5.0.zip。

解压下载文件,得到四个压缩包加到项目的路径中(其实不要全加,但不熟的情况下考虑这么做)。

JDOM的二进制版本下载:http://www.jdom.org/downloads/index.html

把解压后的jdom.jar文件加到项目的类路径中,另外便于调试,还要下载它的源代码。

 

三、使用JDOM解析XML

好了,现在该是正题了。下面通过一个简单的例子说明一下怎么用JDOM这一适合Java程序员习惯的工具包来解析XML文档。

为了简单,我用了如下XML作为要解析的XML文件:

<!--l version="1.0" encoding="gb2312-->

 

 

rjzjh

60.0

 

 

够简单的吧,但它对于我们关心的东西都有了,子节点,属性。

下面是用于解析这个XML文件的Java文件:

 

 

public class JDomParse {

public JDomParse(){

String xmlpath="library.xml";

SAXBuilder builder=new SAXBuilder(false);

try {

Document doc=builder.build(xmlpath);

Element books=doc.getRootElement();

List booklist=books.getChildren("book");

for (Iterator iter = booklist.iterator(); iter.hasNext();) {

Element book = (Element) iter.next();

String email=book.getAttributeValue("email");

System.out.println(email);

String name=book.getChildTextTrim("name");

System.out.println(name);

book.getChild("name").setText("alterrjzjh");

 

}

 

XMLOutputter outputter=new XMLOutputter();

outputter.output(doc,new FileOutputStream(xmlpath));

 

} catch (JDOMException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new JDomParse();

}

}

不到30行代码,现在我对代码解释一下:

四、解释代码

引用的类:

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Iterator;

import java.util.List;

//下面是引用到JDOM中的类

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.JDOMException;

import org.jdom.input.SAXBuilder;

import org.jdom.output.XMLOutputter;

(1)使用JDOM首先要指定使用什么解析器。如:

SAXBuilder builder=new SAXBuilder(false); 这表示使用的是默认的解析器

(2)得到Document,我们以后要进行的所有操作都是对这个Document操作的:

Document doc=builder.build(xmlpath);

(3)得到根元素:

Element books=doc.getRootElement();

在JDOM中所有的节点(DOM中的概念)都是一个org.jdom.Element类,当然他的子节点也是一个org.jdom.Element类。

(4)得到元素(节点)的集合:

List booklist=books.getChildren("book");

这表示得到“books”元素的所在名称为“book”的元素,并把这些元素都放到一个List集合中

(5)轮循List集合

for (Iterator iter = booklist.iterator(); iter.hasNext();) {

Element book = (Element) iter.next();

还有一种轮循方法是:

for(int i=0;I Element book=(Element)booklist.get(i);

}

(6)取得元素的属性:

String email=book.getAttributeValue("email");

取得元素book的属性名为“email”的属性值。

(7)取得元素的子元素(为最低层元素)的值:

String name=book.getChildTextTrim("name");

注意的是,必须确定book元素的名为“name”的子元素只有一个。

(8)改变元素(为最低层元素)的值:

book.getChild("name").setText("alterrjzjh");

这只是对Document的修改,并没有在实际的XML文档中进行修改

(9)保存Document的修改到XML文件中:

XMLOutputter outputter=new XMLOutputter();

outputter.output(doc,new FileOutputStream(xmlpath));

 

我们先要有一个XMLOutputter类,再把已经修改了的Document保存进XML文档中。

到此。用JDOM解析和处理XML文档讲解完了,麻雀虽小,五脏俱全。现在已对JDOM有个整体上的概念了吧。

 

 

一、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文档要素的java类

 

org.jdom.adapters         包含了与dom适配的java类

 

org.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

使用前注意事项:

1.JDOM对于JAXP 以及 TRax 的支持

JDOM 支持JAXP1.1:你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。

制定特别的parser可用如下形式

SAXBuilder parser

  = new SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");

 Document doc = parser.build("http://www.cafeconleche.org/");

 // work with the document...

JDOM也支持TRaX:XSLT可通过JDOMSource以及JDOMResult类来转换(参见以后章节)

2.注意在JDOM里文档(Document)类由org.JDOM.Document 来表示。这要与org.w3c.dom中的Document区别开,这2种格式如何转换在后面会说明。

以下如无特指均指JDOM里的Document。

四、JDOM主要使用方法

1.Ducument类

(1)Document的操作方法:

Element root = new Element("GREETING");

Document doc = new Document(root);

root.setText("Hello JDOM!");

或者简单的使用Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));

这点和DOM不同。Dom则需要更为复杂的代码,如下:

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder builder =factory.newDocumentBuilder();

Document doc = builder.newDocument();

Element root =doc.createElement("root");

Text text = doc.createText("This is the root");

root.appendChild(text);

doc.appendChild(root);

注意事项:JDOM不允许同一个节点同时被2个或多个文档相关联,要在第2个文档中使用原来老文档中的节点的话。首先需要使用detach()把这个节点分开来。

(2)从文件、流、系统ID、URL得到Document对象:

DOMBuilder builder = new DOMBuilder();

Document doc = builder.build(new File("jdom_test.xml"));

SAXBuilder builder = new SAXBuilder();

Document doc = builder.build(url);

在新版本中DOMBuilder 已经Deprecated掉 DOMBuilder.builder(url),用SAX效率会比较快。

这里举一个小例子,为了简单起见,使用String对象直接作为xml数据源:

 public jdomTest() {

    String textXml = null;

    textXml = "<note>";

    textXml = textXml +

        "<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";

    textXml = textXml + "</note>";

    SAXBuilder builder = new SAXBuilder();

    Document doc = null;

    Reader in= new StringReader(textXml);

    try {

      doc = builder.build(in);

      Element root = doc.getRootElement();

      List ls = root.getChildren();//注意此处取出的是root节点下面的一层的Element集合

      for (Iterator iter = ls.iterator(); iter.hasNext(); ) {

        Element el = (Element) iter.next();

        if(el.getName().equals("to")){

         System.out.println(el.getText());

        }

      }

    }

    catch (IOException ex) {

      ex.printStackTrace();

    }

    catch (JDOMException ex) {

      ex.printStackTrace();

    }

  }

(3)DOM的document和JDOM的Document之间的相互转换使用方法,简单!

DOMBuilder builder = new DOMBuilder();

org.jdom.Document jdomDocument = builder.build(domDocument);

DOMOutputter converter = new DOMOutputter();// work with the JDOM document…

org.w3c.dom.Document domDocument = converter.output(jdomDocument);

// work with the DOM document…

2.XML文档输出

XMLOutPutter类:

JDOM的输出非常灵活,支持很多种io格式以及风格的输出

Document doc = new Document(...);

XMLOutputter outp = new XMLOutputter();

outp.output(doc, fileOutputStream); // Raw output

outp.setTextTrim(true); // Compressed output

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

outp.setIndent(" ");// Pretty output

outp.setNewlines(true);

outp.output(doc, System.out);

详细请参阅最新的JDOM API手册

3.Element 类:

(1)浏览Element树

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

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

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

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

JDOM给了我们很多很灵活的使用方法来管理子元素(这里的List是java.util.List)

List allChildren = root.getChildren();

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

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

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

allChildren.add(new Element("jane"));// 加入

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

allChildren.add(0, new Element("first"));

(2)移动Elements:

在JDOM里很简单

Element movable = new Element("movable");

parent1.addContent(movable); // place

parent1.removeContent(movable); // remove

parent2.addContent(movable); // add

在Dom里

Element movable = 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内容读取

<description>

A cool demo

</description>

// The text is directly available

// Returns "\n A cool demo\n"

String desc = element.getText();

// There's a convenient shortcut

// Returns "A cool demo"

String desc = element.getTextTrim();

(4)Elment内容修改

element.setText("A new description");

3.可正确解释特殊字符

element.setText("<xml> content");

4.CDATA的数据写入、读出

element.addContent(new CDATA("<xml> content"));

String noDifference = element.getText();

混合内容

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

<table>

<!-- Some comment -->

Some text

<tr>Some child element</tr>

</table>

取table的子元素tr

String text = table.getTextTrim();

Element tr = table.getChild("tr");

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

List mixedCo = table.getContent();

Iterator itr = mixedCo.iterator();

while (itr.hasNext()) {

Object o = i.next();

if (o instanceof Comment) {...}

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

}

// 现在移除Comment,注意这里游标应为1。这是由于回车键也被解析成Text类的缘故,所以Comment项应为1。

mixedCo.remove(1);

4.Attribute类

<table width="100%" border="0"> </table>

String width = table.getAttributeValue("width");//获得attribute

int border = table.getAttribute("width").getIntValue();

table.setAttribute("vspace", "0");//设置attribute

table.removeAttribute("vspace");// 删除一个或全部attribute

table.getAttributes().clear();

5.处理指令(Processing Instructions)操作

一个Pls的例子

<?br?>

<?cocoon-process type="xslt"?>

          |        |

          |        |

        目标     数据

处理目标名称(Target)

String target = pi.getTarget();

获得所有数据(data),在目标(target)以后的所有数据都会被返回。

String data = pi.getData();

String type = pi.getValue("type");获得指定属性的数据

List ls = pi.getNames();获得所有属性的名称

6.命名空间操作

<xhtml:html

 xmlns:xhtml="http://www.w3.org/1999/xhtml">

<xhtml:title>Home Page</xhtml:title>

</xhtml:html>

Namespace xhtml = Namespace.getNamespace("xhtml", "http://www.w3.org/1999/xhtml");

List kids = html.getChildren("title", xhtml);

Element kid = html.getChild("title", xhtml);

kid.addContent(new Element("table", xhtml));

7.XSLT格式转换

使用以下函数可对XSLT转换

最后如果你需要使用w3c的Document则需要转换一下。

public static Document transform(String stylesheet,Document in)

                                        throws JDOMException {

     try {

       Transformer transformer = TransformerFactory.newInstance()

                             .newTransformer(new StreamSource(stylesheet));

       JDOMResult out = new JDOMResult();

       transformer.transform(new JDOMSource(in), out);

       return out.getDeocument();

     }

     catch (TransformerException e) {

       throw new JDOMException("XSLT Trandformation failed", e);

     }

   }

五、用例:

1、生成xml文档:

 

 

public class WriteXML{

    public void BuildXML() throws Exception {

        Element root,student,number,name,age;        

        root = new Element("student-info"); //生成根元素:student-info

        student = new Element("student"); //生成元素:student(number,name,age)                            

        number = new Element("number");

        name = new Element("name");

        age = new Element("age");

        Document doc = new Document(root); //将根元素植入文档doc中

        number.setText("001");

        name.setText("lnman");

        age.setText("24");

        student.addContent(number);

        student.addContent(name);

        student.addContent(age);

        root.addContent(student);

        Format format = Format.getCompactFormat();

        format.setEncoding("gb2312"); //设置xml文件的字符为gb2312

        format.setIndent("    "); //设置xml文件的缩进为4个空格

        XMLOutputter XMLOut = new XMLOutputter(format);//元素后换行一层元素缩四格

        XMLOut.output(doc, new FileOutputStream("studentinfo.xml")); 

}

    public static void main(String[] args) throws Exception {

        WriteXML w = new WriteXML();

        System.out.println("Now we build an XML document .....");

        w.BuildXML();

        System.out.println("finished!");

}

}

生成的xml文档为:

<?xml version="1.0" encoding="gb2312"?>

<student-info>

    <student>

        <number>001</number>

        <name>lnman</name>

        <age>24</age>

    </student>

</student-info>

 

 

创建XML文档2:

 public class CreateXML {

  public void Create() {

   try {

    Document doc = new Document();  

    ProcessingInstruction pi=new ProcessingInstruction("xml-stylesheet","type="text/xsl" href="test.xsl"");

    doc.addContent(pi);   

    Namespace ns = Namespace.getNamespace("http://www.bromon.org" );

    Namespace ns2 = Namespace.getNamespace("other", "http://www.w3c.org" );

    Element root = new Element("根元素", ns);

    root.addNamespaceDeclaration(ns2);

    doc.setRootElement(root);

    Element el1 = new Element("元素一");

    el1.setAttribute("属性", "属性一");   

    Text text1=new Text("元素值");

             Element em = new Element("元素二").addContent("第二个元素");

    el1.addContent(text1);

             el1.addContent(em);            

             Element el2 = new Element("元素三").addContent("第三个元素");

             root.addContent(el1);

             root.addContent(el2);            

             //缩进四个空格,自动换行,gb2312编码

             XMLOutputter outputter = new XMLOutputter("  ", true,"GB2312");

             outputter.output(doc, new FileWriter("test.xml"));

         }catch(Exception e)  {

          System.out.println(e);

         }

     }    

     public static void main(String args[]) {

      new CreateXML().Create();

color: #000

分享到:
评论

相关推荐

    jdom源码+jdom.jar

    jdom源码+jdom.jar jdom源码+jdom.jar

    jdom-1.0,jdom解析xml

    jdom-1.0 jdom jdom-1.0,jdom解析xml

    jdom-1.1.zip jdom-1.1.jar jdom.jar jdom库 jdom操作xml

    jdom-1.1.zip jdom-1.1.jar jdom.jar jdom库 jdom操作xml

    Jdom教程 Jdom教程.pdf

    Jdom教程. .

    Android代码-jdom

    Introduction to the JDOM project Please see the JDOM web site at http://jdom.org/ and GitHub repository at https://github.com/hunterhacker/jdom/ Quick-Start for JDOM See the github wiki for a Primer ...

    jdom文件

    jdom jdom jdom jdom jdom

    jdom源代码,包含jdom.jar

    jdom源代码,其中包含jdom.jar

    jdom1.1.3xml解析工具类

    org.jdom包含了所有的xml文档要素的java类 org.jdom.adapters包含了与dom适配的java类 org.jdom.filter包含了xml文档的过滤器类 org.jdom.input包含了读取xml文档的类 org.jdom.output包含了写入xml文档的类 org....

    JDOM讲解(java)

    JDOM讲解 JDOM讲解 JDOM讲解

    JDOM 介绍及使用指南

    JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和...

    jdom-1.1.2&jdom帮助文档

    压缩包内有jdom-1.1.2和jdom的chm格式的帮助文档,文档的内容来自官网,因而能够保证完整性。

    JDOM的jar包 jdom-b7.jar

    JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和...

    JDOM 介绍及使用

    JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和...

    jdom 下载 jdom 下载

    jdom 下载 jdom 下载jdom 下载 jdom 下载jdom 下载 jdom 下载jdom 下载 jdom 下载jdom 下载 jdom 下载

    jdom的两种版本jar包集合

    我在网上找org.jdom.document资源时,发现都要大量c币,但是本人没钱-.-因此在官网上下载了jdom资源包,放在这里希望能帮助到各位童鞋6.6

    JDOM1.1(Jdom文档)

    编写XML时要用到JDOM是需要 包含有jar包,API文档 源代码等

    JDOM(java)使用详解及实例

    一、JDOM 简介 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及...

    JDOM创建XML完整实例和jdom-2.0.5.jar

    在工作中发现jdom生成xml...在网络搜索发现有很多人遇到了但是没有详细的解决方案。后来仔细看了jdom-2.0.5.jar的方法发现setAttribute(String, String, Namespace)方法可以解决直接root.setAttribute("xsi:type"...

    JDOM v1.0 API

    JDOM v1.0 API Specification jdom api文档

    jdom开发工具包

    jdom1.1.1与jdom2.05最新开发工具包。 jdom1.1.1使用方法: import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; jdom2.05使用方法: import org.jdom2.Document; import org....

Global site tag (gtag.js) - Google Analytics