Using_Digester_1

本文介绍了一种利用Apache Jakarta Commons Digester框架将XML文档转换为Java Bean对象层次结构的方法。Digester提供了一种比SAX和DOM更高效、更简单的解决方案,并通过定义规则来处理XML元素。

 

Turning an XML document into a corresponding hierarchy of Java bean objects is a fairly common task. In a previous article, I described how to accomplish this using the standard SAX and DOM APIs.

 

Although powerful and flexible, both APIs are, in effect, too low-level for the specific task at hand. Furthermore, the unmarshalling procedure itself requires a fair amount of coding: a parse-stack must be maintained when using SAX, and the DOM-tree must be navigated when using DOM.

This is where the Apache Jakarta Commons Digester framework comes in.

The Jakarta Digester Framework

The Jakarta Digester framework grew out of the Jakarta Struts Web toolkit. Originally developed to process the central struts-config.xml configuration file, it was soon recognized that the framework was more generally useful, and moved to the Jakarta Commons project, the stated goal of which is to provide a "repository of reusable Java components." The most recent version, Digester 1.3, was released on August 13, 2002.

The Digester class lets the application programmer specify a set of actions to be performed whenever the parser encounters certain simple patterns in the XML document. The Digester framework comes with 10 prepackaged "rules," which cover most of the required tasks when unmarshalling XML (such as creating a bean or setting a bean property), but each user is free to define and implement his or her own rules, as necessary.

The Example Document and Beans

In this example, we will unmarshall the same XML document that we used in the previous article:

<?xml version="1.0"?>

<catalog library="somewhere">

   <book>
      <author>Author 1</author>
      <title>Title 1</title>
   </book>

   <book>
      <author>Author 2</author>
      <title>His One Book</title>
   </book>

   <magazine>
      <name>Mag Title 1</name>

      <article page="5">
         <headline>Some Headline</headline>
      </article>

      <article page="9">
         <headline>Another Headline</headline>
      </article>
   </magazine>

   <book>
      <author>Author 2</author>
      <title>His Other Book</title>
   </book>

   <magazine>
      <name>Mag Title 2</name>

      <article page="17">
         <headline>Second Headline</headline>
      </article>
   </magazine>

</catalog>

The bean classes are also the same, except for one important change: In the previous article, I had declared these classes to have package scope -- primarily so that I could define all of them in the same source file! Using the Digester framework, this is no longer possible; the classes need to be declared as public (as is required for classes conforming to the JavaBeans specification):

import java.util.Vector;

public class Catalog {
   private Vector books;
   private Vector magazines;

   public Catalog() {
      books = new Vector();
      magazines = new Vector();
   }

   public void addBook( Book rhs ) {
      books.addElement( rhs );
   }
   public void addMagazine( Magazine rhs ) {
      magazines.addElement( rhs );
   }

   public String toString() {
      String newline = System.getProperty( "line.separator" );
      StringBuffer buf = new StringBuffer();

      buf.append( "--- Books ---" ).append( newline );
      for( int i=0; i<books.size(); i++ ){
         buf.append( books.elementAt(i) ).append( newline );
      }

      buf.append( "--- Magazines ---" ).append( newline );
      for( int i=0; i<magazines.size(); i++ ){
         buf.append( magazines.elementAt(i) ).append( newline );
      }

      return buf.toString();
   }
}

 

public class Book {
   private String author;
   private String title;

   public Book() {}

   public void setAuthor( String rhs ) { author = rhs; }
   public void setTitle(  String rhs ) { title  = rhs; }

   public String toString() {
      return "Book: Author='" + author + "' Title='" + title + "'";
   }
}

 

import java.util.Vector;

public class Magazine {
   private String name;
   private Vector articles;

   public Magazine() {
      articles = new Vector();
   }

   public void setName( String rhs ) { name = rhs; }

   public void addArticle( Article a ) {
      articles.addElement( a );
   }

   public String toString() {
      StringBuffer buf = new StringBuffer( "Magazine: Name='" + name + "' ");
      for( int i=0; i<articles.size(); i++ ){
         buf.append( articles.elementAt(i).toString() );
      }
      return buf.toString();
   }
}

 

public class Article {
   private String headline;
   private String page;

   public Article() {}

   public void setHeadline( String rhs ) { headline = rhs; }
   public void setPage(     String rhs ) { page     = rhs; }

   public String toString() {
      return "Article: Headline='" + headline + "' on page='" + page + "' ";
   }
}

Using CATALINA_BASE: "C:\Users\hw\AppData\Local\JetBrains\IntelliJIdea2024.1\tomcat\b47a5540-753d-496f-a7ac-2be863a0d0e1" Using CATALINA_HOME: "E:\java_dev\apache-tomcat-9.0.22" Using CATALINA_TMPDIR: "E:\java_dev\apache-tomcat-9.0.22\temp" Using JRE_HOME: "C:\Program Files\Java\jdk1.8.0_361" Using CLASSPATH: "E:\java_dev\apache-tomcat-9.0.22\bin\bootstrap.jar;E:\java_dev\apache-tomcat-9.0.22\bin\tomcat-juli.jar" 16-Jun-2025 19:58:07.775 璀﹀憡 [main] org.apache.tomcat.util.digester.Digester.endElement No rules found matching [Server/Service/Engine/Host/Contex] 16-Jun-2025 19:58:07.778 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.鏈嶅姟鍣ㄧ増鏈�: Apache Tomcat/9.0.22 16-Jun-2025 19:58:07.778 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.鏋勫缓: Jul 4 2019 14:20:06 UTC 16-Jun-2025 19:58:07.778 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.22.0 16-Jun-2025 19:58:07.778 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Windows 11 16-Jun-2025 19:58:07.778 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.鐗堟湰: 10.0 16-Jun-2025 19:58:07.778 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 缁�.閫�: amd64 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 鐜鍙橀噺: C:\Program Files\Java\jdk1.8.0_361\jre 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM 鐗堟湰: 1.8.0_361-b09 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.渚涘簲鍟�: Oracle Corporation 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\hw\AppData\Local\JetBrains\IntelliJIdea2024.1\tomcat\b47a5540-753d-496f-a7ac-2be863a0d0e1 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: E:\java_dev\apache-tomcat-9.0.22 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\Users\hw\AppData\Local\JetBrains\IntelliJIdea2024.1\tomcat\b47a5540-753d-496f-a7ac-2be863a0d0e1\conf\logging.properties 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote= 16-Jun-2025 19:58:07.779 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.port=1099 16-Jun-2025 19:58:07.780 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.ssl=false 16-Jun-2025 19:58:07.780 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.password.file=C:\Users\hw\AppData\Local\JetBrains\IntelliJIdea2024.1\tomcat\b47a5540-753d-496f-a7ac-2be863a0d0e1\jmxremote.password 16-Jun-2025 19:58:07.780 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.access.file=C:\Users\hw\AppData\Local\JetBrains\IntelliJIdea2024.1\tomcat\b47a5540-753d-496f-a7ac-2be863a0d0e1\jmxremote.access 16-Jun-2025 19:58:07.780 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.rmi.server.hostname=127.0.0.1 16-Jun-2025 19:58:07.780 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048 16-Jun-2025 19:58:07.780 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 16-Jun-2025 19:58:07.780 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs= 16-Jun-2025 19:58:07.782 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=C:\Users\hw\AppData\Local\JetBrains\IntelliJIdea2024.1\tomcat\b47a5540-753d-496f-a7ac-2be863a0d0e1 16-Jun-2025 19:58:07.782 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=E:\java_dev\apache-tomcat-9.0.22 16-Jun-2025 19:58:07.782 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=E:\java_dev\apache-tomcat-9.0.22\temp 16-Jun-2025 19:58:07.782 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jdk1.8.0_361\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Java\jdk1.8.0_361\jre\bin;D:\hw\python3.8.5;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;E:\java_dev\Maven\apache-maven-3.6.1\bin;E:\java_dev\MYSQL\Program Files\MySQL\MySQL Server 8.0\bin;E:\java_dev\node-v16.20.2-win-x64;C:\Program Files\Java\jdk1.8.0_361\bin;E:\java_dev\apache-tomcat-9.0.22\bin;E:\java_dev\apache-tomcat-9.0.22\lib;D:\hw\python3.8.5;D:\hw\pycharm\P鐗坧ycharm\PyCharm 2024.1.3\bin;;D:\hw\pycharm\PyCharm Community Edition 2023.2.3\bin;;C:\Users\hw\AppData\Local\Microsoft\WindowsApps;D:\JAVA\鐜閰嶇疆\IntelliJ IDEA Community Edition 2024.1\bin;;D:\JAVA\鐜閰嶇疆\IntelliJ IDEA 2023.3.4\bin;;D:\Visual Studio Code\Microsoft VS Code\bin;D:\nodejs;;C:\Users\hw\.lmstudio\bin;.] 16-Jun-2025 19:58:07.971 淇℃伅 [main] org.apache.coyote.AbstractProtocol.init 鍒濆鍖栧崗璁鐞嗗櫒 ["http-nio-8080"] 16-Jun-2025 19:58:07.990 淇℃伅 [main] org.apache.coyote.AbstractProtocol.init 鍒濆鍖栧崗璁鐞嗗櫒 ["ajp-nio-8009"] 16-Jun-2025 19:58:07.993 淇℃伅 [main] org.apache.catalina.startup.Catalina.load 鏈嶅姟鍣ㄥ湪[368]姣鍐呭垵濮嬪寲 16-Jun-2025 19:58:08.021 淇℃伅 [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 16-Jun-2025 19:58:08.021 淇℃伅 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.22] 16-Jun-2025 19:58:08.029 淇℃伅 [main] org.apache.coyote.AbstractProtocol.start 寮�濮嬪崗璁鐞嗗彞鏌刐"http-nio-8080"] 16-Jun-2025 19:58:08.035 淇℃伅 [main] org.apache.coyote.AbstractProtocol.start 寮�濮嬪崗璁鐞嗗彞鏌刐"ajp-nio-8009"] 16-Jun-2025 19:58:08.036 淇℃伅 [main] org.apache.catalina.startup.Catalina.start Server startup in [43] milliseconds Connected to server 16-Jun-2025 19:58:18.043 淇℃伅 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰� [E:\java_dev\apache-tomcat-9.0.22\webapps\manager] 16-Jun-2025 19:58:18.314 淇℃伅 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [E:\java_dev\apache-tomcat-9.0.22\webapps\manager] has finished in [271] ms E:\java_dev\apache-tomcat-9.0.22\bin\catalina.bat stop Using CATALINA_BASE: "C:\Users\hw\AppData\Local\JetBrains\IntelliJIdea2024.1\tomcat\b47a5540-753d-496f-a7ac-2be863a0d0e1" Using CATALINA_HOME: "E:\java_dev\apache-tomcat-9.0.22" Using CATALINA_TMPDIR: "E:\java_dev\apache-tomcat-9.0.22\temp" Using JRE_HOME: "C:\Program Files\Java\jdk1.8.0_361" Using CLASSPATH: "E:\java_dev\apache-tomcat-9.0.22\bin\bootstrap.jar;E:\java_dev\apache-tomcat-9.0.22\bin\tomcat-juli.jar" 16-Jun-2025 20:02:31.227 淇℃伅 [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance. 16-Jun-2025 20:02:31.227 淇℃伅 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"] 16-Jun-2025 20:02:31.322 淇℃伅 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"] 16-Jun-2025 20:02:31.409 淇℃伅 [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina] 16-Jun-2025 20:02:31.418 淇℃伅 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"] 16-Jun-2025 20:02:31.418 淇℃伅 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"] 16-Jun-2025 20:02:31.419 淇℃伅 [main] org.apache.coyote.AbstractProtocol.destroy 姝e湪鎽ф瘉鍗忚澶勭悊鍣� ["http-nio-8080"] 16-Jun-2025 20:02:31.420 淇℃伅 [main] org.apache.coyote.AbstractProtocol.destroy 姝e湪鎽ф瘉鍗忚澶勭悊鍣� ["ajp-nio-8009"] Disconnected from server
最新发布
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值