【转】Jdom入门知识

【转】Jdom入门知识

最近的工作常常要和XML格式的文档或字符串打交道,发现用JDOM来做真是方便。可以实现XML应用程序的快速开发。

第一篇 使用JDOM解析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习惯的不同。

      还有最好的是它开放源代码,我们可以在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文件:
<?xml version=”1.0″ encoding=”gb2312″?>
<books>
   <book email=”zhoujunhui”>
     <name>rjzjh</name>
     <price>60.0</price>
  </book>
</books>
够简单的吧,但它对于我们关心的东西都有了,子节点,属性。
下面是用于解析这个XML文件的Java文件:


不到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<booklist.size();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 中,XML 元素就是 Element 的实例,XML 属性就是 Attribute 的实例,XML 文档本身就是 Document 的实例。
    因为 JDOM 对象就是像 Document、Element 和 Attribute 这些类的直接实例,因此创建一个新 JDOM 对象就如在 Java 语言中使用 new 操作符一样容易。JDOM 的使用是直截了当的。
    JDOM 使用标准的 Java 编码模式。只要有可能,它使用 Java new 操作符而不故弄玄虚使用复杂的工厂化模式,使对象操作即便对于初学用户也很方便。
    本文分两步对JDOM的应用加以介绍:XML创建 和 XML解析

一、XML文档创建

    我们由零开始利用JDOM生成一个XML文档。最后的结果(样本文档)看起来象这样:
    <?xml version=”1.0″ encoding=”UTF-8″?>
    <MyInfo comment=”introduce myself”>
        <name>kingwong</name>
        <sex value=”male”/>
        <contact>
            <telephone>87654321</telephone>
        </contact>
    </MyInfo>

    1.以 MyInfo 为根元素创建文档

        Element rootElement = new Element(“MyInfo”);//所有的XML元素都是 Element 的实例。根元素也不例外:)
        Document myDocument = new Document(rootElement);//以根元素作为参数创建Document对象。一个Document只有一个根,即root元素。

    2.给根元素添加属性

        Attribute rootAttri = new Attribute(“comment”,”introduce myself”);//创建名为 commnet,值为 introduce myself 的属性。
        rootElement.setAttribute(rootAttri);//将刚创建的属性添加到根元素。
        这两行代码你也可以合成一行来写,象这样:
        rootElement.setAttribute(new Attribute(“comment”,”introduce myself”));
        或者
        rootElement.setAttribute(“comment”,”introduce myself”);

    3.添加元素和子元素

        JDOM里子元素是作为 content(内容)添加到父元素里面去的,所谓content就是类似上面样本文档中<name></name>之间的东东,即kingwong。罗嗦了点是吧:)
        Element nameElement = new Element(“name”);//创建 name 元素
        nameElement.addContent(“kingwong”);//将kingwong作为content添加到name元素
        rootElement.addContent(nameElement);//将name元素作为content添加到根元素
        这三行你也可以合为一句,象这样:
       rootElement.addContent((Content)(new Element(“name”).addContent(“kingwong”)));//因为addContent(Content child)方法返回的是一个Parent接口,而Element类同时继承了Content类和实现了Parent接口,所以我们把它造型成 Content。
        我们用同样的方法添加带属性的子元素<sex value=”male”/>
        rootElement.addContent(new Element(“sex”).setAttribute(“value”,”male”));//注意这里不需要转型,因为 addAttribute(String name,String value)返回值就是一个 Element。
        同样的,我们添加<contract />元素到根元素下,用法上一样,只是稍微复杂了一些:
        rootElement.addContent((Content)(new Element(“contact”).addContent((Content)(new Element(“telephone”).addContent(“87654321”)))));
        如果你对这种简写形式还不太习惯,你完全可以分步来做,就象本节刚开始的时候一样。事实上如果层次比较多,写成分步的形式更清晰些,也不容易出错。

    4.删除子元素

        这个操作比较简单:
        rootElement.removeChild(“sex”);//该方法返回一个布尔值
        到目前为止,我们学习了一下JDOM文档生成操作。上面建立了一个样本文档,可是我们怎么知道对不对呢?因此需要输出来看一下。我们将JDOM生成的文档输出到控制台,使用     JDOM 的 XMLOutputter 类。

    5.  将 JDOM 转化为 XML 文本

        XMLOutputter xmlOut = new XMLOutputter(”  “,true);
try {

  xmlOut.output(myDocument,System.out);
} catch (IOException e) {

  e.printStackTrace();
}
XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素缩进两个空格,并且希望元素间有空行。
new XMLOutputter(java.lang.String indent, boolean newlines)这个方法在最新版本中已经不建议使用。JDOM有一个专门的用来定义格式化输出的类:org.jdom.output.Format,如果你没有特殊的要求,有时候使用里面的几个静态方法(应该可以说是预定义格式)如 getPrettyFormat()就可以了。我们把上面的输出格式稍微改一下,就象这样:
XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat()); 

    6.将JDOM文档转化为其他形式

        XMLOutputter 还可输出到 Writer 或 OutputStream。为了输出JDOM文档到一个文本文件,我们可以这样做:
        FileWriter writer = new FileWriter(“/some/directory/myFile.xml”);
        outputter.output(myDocument, writer);
        writer.close();
        XMLOutputter 还可输出到字符串,以便程序后面进行再处理:
        Strng outString = xmlOut.outputString(myDocument);
        当然,在输出的时候你不一定要输出所有的整个文档,你可以选择元素进行输出:
        xmlOut.output(rootElement.getChild(“name”),System.out);
        一句话,JDOM非常灵活方便!如果你想进一步研究JDOM,请到官方网站去看一看:http://www.jdom.org

    本节示例源码:
package com.cyberobject.study;

import java.io.IOException;

import org.jdom.Attribute;
import org.jdom.Content;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
* @author kingwong
*
* TODO To change the template for this generated type comment go to
* Window – Preferences – Java – Code Style – Code Templates
*/
public class TestJDOM {

public static void main(String[] args)
{

  Element rootElement = new Element(“MyInfo”);
  Document myDocument = new Document(rootElement);
//  Attribute rootAttri = new Attribute(“comment”,”introduce myself”);
//  rootElement.setAttribute(rootAttri);
  rootElement.setAttribute(“comment”,”introduce myself”);
  //rootElement.setAttribute(new Attribute(“comment”,”introduce myself”));
//  Element sexElement = new Element(“sex”);
//  rootElement.addContent(sexElement);
//  Element nameElement = new Element(“name”);
//  nameElement.addContent(“kingwong”);
//  rootElement.addContent(nameElement);
  rootElement.addContent((Content)(new Element(“name”).addContent(“kingwong”)));
  rootElement.addContent(new Element(“sex”).setAttribute(“value”,”male”));
  rootElement.addContent((Content)(new Element(“contract”).addContent((Content)(new Element(“telephone”).addContent(“87654321”)))));
  rootElement.removeChild(“sex”);
  XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
  try {

   xmlOut.output(myDocument,System.out);
   //xmlOut.output(rootElement.getChild(“name”),System.out);
   //String outString = xmlOut.outputString(myDocument);
  } catch (IOException e) {

   e.printStackTrace();
  }
}
}

二、XML文档解析

    JDOM 不光可以很方便的建立XML文档,它的另一个用处是它能够读取并操作现有的 XML 数据。
    JDOM的解析器在org.jdom.input.*这个包里,其中的DOMBuilder的功能是将DOM模型的Document解析成JDOM模型的 Document;SAXBuilder的功能是从文件或流中解析出符合JDOM模型的XML树。由于我们经常要从一个文件里读取数据,因此我们应该采用后者作为解析工具。
解析一个xml文档,基本可以看成以下几个步骤:

    1.实例化一个合适的解析器对象

        本例中我们使用SAXBuilder:
        SAXBuilder sb = new SAXBuilder();

    2.以包含XML数据的文件为参数,构建一个文档对象myDocument

        Document myDocument = sb.build(/some/directory/myFile.xml);

    3.获到根元素       

Element rootElement = 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元素里插入了一个新元素<email value=”wanghua@cyberobject.com” />。尽管我们实现了对于XML的基本操作,细心的朋友可能会有疑问:如果XML文档的层次稍微复杂一些,如果嵌套多达几十上百层的话(开个玩笑),如果靠这样从根元素一级一级地通过 getChild(“childname”)来访问子元素的话,将会非常痛苦!是的,的确是这样,但是我们有另一个有力的工具XPath,为什么不用呢?这是后话!先卖个关子(手敲累啦,下回吧,呵呵)。

/*

* Created on 2004-8-21

*

* TODO To change the template for this generated file go to

* Window – Preferences – Java – Code Style – Code Templates

*/

package com.cyberobject.study;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
* @author kingwong
*
* TODO To change the template for this generated type comment go to
* Window – Preferences – Java – Code Style – Code Templates
*/
public class TestJDOM2 {

public static void main(String[] args){

SAXBuilder sb = new SAXBuilder();
    try
    {       
     Document doc = sb.build(“myFile.xml”);
  Element root = doc.getRootElement();
  String str1 = root.getAttributeValue(“comment”);
  System.out.println(“Root Element’s comment attribute is : ” str1);
  String str2 = root.getChild(“sex”).getAttributeValue(“value”);
  System.out.println(“sex Element’s value attribute is : ” str2);
  String str3 = root.getChildText(“name”);
  System.out.println(“name Element’s content is :” str3);
  String str4 = root.getChild(“contact”).getChildText(“telephone”);
  System.out.println(“contact Element’s telephone subelement content is : ” str4 “\n”);
  Element inputElement = root.getChild(“contact”);
  inputElement.addContent(new Element(“email”).setAttribute(“value”,”wanghua@cyberobject.com“));
  XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
     String outStr = xmlOut.outputString(root);
     System.out.println(outStr);
    }
    catch(Exception e)
    {

        e.printStackTrace();
    }
}
}

转载于:https://www.cnblogs.com/shanghaif/archive/2008/10/14/1311118.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110984.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Activity 跳转的生命周期变化

    Activity 跳转的生命周期变化####(1)Activity1跳转到Activity2的生命周期流程1.Activity1启动:Activity1:onCreate()Activity1:onStart()Activity1:onResume()2.点击按钮跳转到Activity2:Activity1:onPause()Activity2:…

  • Parallel.ForEach 使用多线程遍历循环

    Parallel.ForEach 使用多线程遍历循环原地址路径:https://www.cnblogs.com/personblog/archive/2019/10/09/11640801.htmlParallel.ForEach相对于foreach是多线程,并行操作;foreach是单线程循环操作。staticvoidMain(string[]args){Console.WriteLine(“HelloWorld!”);List<UserInfo>lst=n

  • 打印显示服务器脱机win10,如何在Win10中将打印机状态从脱机更改为联机

    打印显示服务器脱机win10,如何在Win10中将打印机状态从脱机更改为联机Windows10上的打印机可以具有脱机和联机状态。我很惊讶地发现这一点,因为每个人都希望他们的打印机可供使用并准备好进行打印。应该知道,当打印机脱机时,并不意味着它已被删除。由于打印过程中出现错误或驱动程序出现问题,它可能会脱机。如果发现问题,Windows操作系统可以将打印机的状态设置为脱机。在本文中,我将展示如何将打印机状态更改为联机或将打印机恢复为联机状态。打印机离线?将打印…

  • 工作流入门教程(flowable框架)

    工作流入门教程(flowable框架)最近有一段时间没写博客了,本来打算写写对于工作流的心得,但是工作时间比较饱和只好延后。最初接触工作流是上一家公司工作,具体我不透露哪家公司,只是感受到人情冷暖,或许公司都是这样,当你的价值被用完了也就是你走人的时候。好了,废话不多说,我们直接进入主题。前言对于框架的选型,我推荐使用flowable框架,在最初的项目选型是选择activiti的,但是深入去了解框架的时候发现activiti还是有一些坑的,而flowable正是activiti框架的修正版,据了解flowable的背景是activiti原班

  • 《前端运维》二、Nginx–2请求处理流程及核心模块

    前一篇内容,我们学习了nginx的一些基本概念、安装和目录的作用。这篇文章我们来学习一些更加深入的内容。一、Nginx请求处理流程我们先来看张图吧:我们看上图,首先客户端请求到Nginx服务器,

  • 文本分类——常用经典技术解析(jieba,word2vec,样本不平衡问题)「建议收藏」

    文本分类——常用经典技术解析(jieba,word2vec,样本不平衡问题)「建议收藏」一个文本分类任务的典型操作流程如下:即拿到数据后先分词,然后转化为词向量(数值化过程),最后对数值化后的数据进行分类。一、jieba分词原理jieba自带了一个叫做dict.txt的词典,里面有2万多条词,包含了词条出现的次数(这个次数是于作者自己基于人民日报语料等资源训练得出来的)和词性.这个第一条的trie树结构的词图扫描,说的就是把这2万多条词语,放到一个trie树(词典树…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号