`
senton
  • 浏览: 206749 次
  • 性别: Icon_minigender_1
  • 来自: 紫禁城
社区版块
存档分类
最新评论

XML解析之Degister(新手必看)

    博客分类:
  • Xml
阅读更多
XML已经成为了我们开发过程中不可缺少的技术。我们可以用它来描述程序的配置,适配不同的数据格式,甚至作为数据库使用。
帮助处理XML的工具很多,它们让我们活得更轻松。Jakarta Commons下的Digester就是一个不错的工具。它提供了一种将XML与Java对象进行映射的方便方法。这么说可能让新手更迷惑,还是举个例子吧!
我们有这样一个XML文件:
  1.  
  2. <!-- Memos_2004-01-16.xml -->
  3. <?xml version="1.0"?>
  4. <memos>
  5. <memo>
  6.     <title>About Jakatar commons Digester</title>
  7.     <date>2004-01-16 02:05</date>
  8.     <body>We are working on Digester 1.6-dev.Because it supported read
  9.          attributes of element.We should pay attention to the releasing of 
  10.          Digester for its changing.</body>
  11. </memo>
  12.  
  13. <memo>
  14.     <title>Ah ha! Its good night!</title>
  15.     <date>2004-01-16 4:19</date>
  16.     <body>I has enhanced the basic framework of my app with improved 
  17.          architecture and performance. Its time to sleep. Good night, 
  18.          boys.</body>
  19. </memo>
  20. </memos>

这是我的备忘录,我用xml作为数据库。现在我们想用Java程序来读/写这个数据库应该怎么做呢?啊!对了,SAX、DOM……,好了,忘了它们吧!我们有更Easy的办法!
我们先来创建一个Memo类,它用来保存一条Memo。它有三个属性用来保存标题、日期以及Memo的正文。我们提供了公共的Setter和Getter,并且我们重载了toString()方法以便查看运行结果。
  1.  
  2. /* Memo.java */
  3. package kitta.memo;
  4.  
  5. public class Memo
  6. {
  7.     /*-----/ Instance Field(s) /------------------------------------------------*/
  8.     private String _title;
  9.     private String _body;
  10.     private String _date;
  11.     /*-----/ Constructor(s) /---------------------------------------------------*/
  12.     public Memo()
  13.     {
  14.         /* do nothing now */
  15.     }
  16.  
  17.     /*-----/ Getter(s) & Setter(s) /--------------------------------------------*/
  18.     public String getBody()
  19.     {
  20.         return _body;
  21.     }
  22.  
  23.     public void setBody(String body)
  24.     {
  25.         _body = body;
  26.     }
  27.  
  28.     public String getTitle()
  29.     {
  30.         return _title;
  31.     }
  32.  
  33.     public void setTitle(String title)
  34.     {
  35.         _title = title;
  36.     }
  37.  
  38.     public String getDate()
  39.     {
  40.         return _date;
  41.     }
  42.     public void setDate(String date)
  43.     {
  44.         _date = date;
  45.     }
  46.   /*-----/ Overrided Method(s) /----------------------------------------------*/
  47.     public String toString()
  48.     {
  49.         StringBuffer buf = new StringBuffer();
  50.         buf.append("\t").append(_title);
  51.         buf.append("\tat\t").append(_date).append("\n\n");
  52.         buf.append("\t").append(_body).append("\n");
  53.         buf.append("-----------------------------------------------------------\n");
  54.         return buf.toString();
  55.     }
  56. }



然后是Memos类,它实际上是一个Memo对象的集合,完全可以用一个Collection的子类去代替它,但是这里之所以还是使用它主要是为了概念上的清晰。它同样很简单,一个私有属性_memos用来保存所有Memo对象的实例,一个共有方法addMemo()用来添加Memo,toString()方法的目的同上。
  1.  
  2. /* Memos.java */
  3. package kitta.memo;
  4.  
  5. import java.util.Collection;
  6. import java.util.Iterator;
  7. import java.util.Vector;
  8.  
  9.  
  10. public class Memos
  11. {
  12.   /*-----/ Instance Fields /--------------------------------------------------*/
  13.   private Collection _memos=new Vector();
  14.   /*-----/ Constructor(s) /---------------------------------------------------*/
  15.   public Memos()
  16.   {
  17.     /* do nothing */
  18.   }
  19.   /*-----/ Getter(s) & Setter(s) /--------------------------------------------*/
  20.   public void addMemo(Memo memo)
  21.   {
  22.     _memos.add(memo);
  23.   }
  24.   /*-----/ Overrided Method(s) /----------------------------------------------*/
  25.   public String toString()
  26.   {
  27.     StringBuffer buf = new StringBuffer();
  28.     buf.append("-----------------------------------------------------------\n");
  29.     buf.append("        Memo Application\n");
  30.     buf.append("    (").append(_memos.size()).append(" memos total found.)\n");
  31.     buf.append("-----------------------------------------------------------\n");
  32.   
  33.     for(Iterator itr = _memos.iterator();itr.hasNext();)
  34.     {
  35.       Memo m = (Memo) itr.next();
  36.       buf.append(m.toString());
  37.     }
  38.         return buf.toString();
  39.   }
  40. }



请注意init方法,它告诉Digester如何将XML中的数据映射到我们的Java对象。
  1.  
  2. package kitta.memo;
  3.  
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6.  
  7. import org.apache.commons.digester.Digester;
  8.  
  9. public class MemoApp
  10. {
  11.   /*-----/ Instance Field(s) /------------------------------------------------*/
  12.   private    Memos _memos;
  13.   /*-----/ Constructor(s) /---------------------------------------------------*/
  14.     public MemoApp()
  15.     {
  16.         /* do nothing */
  17.     }
  18.   /*-----/ Private Methods(s) /-----------------------------------------------*/
  19.   /**
  20.    * Initializes the instance of Digester.
  21.    */
  22.     private void init(Digester dgstr)
  23.     {
  24.     /* 当遇到memos元素时创建一个Memos对象 */
  25.     dgstr.addObjectCreate("memos", Memos.class);
  26.     /* 当遇到memo元素时创建一个Memo对象 */
  27.     dgstr.addObjectCreate("memos/memo", Memo.class);
  28.     /* 当遇到memos/memo/title元素时,调用当前Memo对象的setTitle方法 */
  29.     dgstr.addBeanPropertySetter("memos/memo/title", "title");
  30.     /* 当遇到memos/memo/body元素时,调用当前Memo对象的setBody */
  31.     dgstr.addBeanPropertySetter("memos/memo/body", "body");
  32.     /* 当遇到memos/memo/date元素时,调用当前Memo对象的setDate方法 */
  33.     dgstr.addBeanPropertySetter("memos/memo/date", "date");
  34.     /* 调用当前的Memos对象的addMemo方法,参数为当前的Memo对象 */
  35.     dgstr.addSetNext("memos/memo", "addMemo");
  36.    
  37.     }
  38.   /**
  39.    * prints details of memos to standard out.
  40.    */
  41.   private void print()
  42.   {
  43.     System.out.println(_memos);
  44.   }
  45.   /**
  46.    * maps the xml data to java object
  47.    */  
  48.   private void load(InputStream in) throws Exception
  49.     {
  50.         Digester dgstr = new Digester();
  51.     init(dgstr);
  52.         try
  53.         {
  54.             _memos = (Memos) dgstr.parse(in);
  55.         } catch (IOException e)
  56.         {
  57.       throw new Exception("Error occured When loading data",e);
  58.         }
  59.     }
  60.   /*-----/ Main Method /------------------------------------------------------*/
  61.   public static void main(String[] args) throws Exception
  62.     {
  63.         MemoApp mapp = new MemoApp();
  64.     /* load xml file from classpath */
  65.     mapp.load(MemoApp.class.getResourceAsStream("/kitta/memo/memo.xml"));
  66.     mapp.print();
  67.     }
  68. }



Digester用"elem/elem/elem"的方式来匹配xml中的元素。这非常直观,实际上我们很早就开始使用类似的方式了。Digester将其称为Pattern。
Digester中还有一个重要的概念就是Rule。我们在init方法中所做的就是将Pattern和Rule关联起来。当Digester发现与我们所注册的Pattern匹配的xml元素时,就会调用我们注册时指定Rule来处理这个元素。

环境


以上代码的测试环境为Windows XP、JDK 1.4.2 03、Digester 1.5 Release。

相关资源


Degister官方资源
Web site: http://jakarta.apache.org/commons/digester/index.html
CVS connection: scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/digester/
CVS Web View: http://cvs.apache.org/viewcvs/jakarta-commons/digester/

一些其它地方的文章:
http://www-106.ibm.com/developerworks/java/library/j-lucene/
http://www.javaworld.com/javaworld/jw-10-2002/jw-1025-opensourceprofile.html
http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html

最后


好啦!就这么简单!因为这只是一些基本的应用,它可以帮助你了解Digester,毕竟这只是一个Getting Start吗!要更好的应用,就要更深入的研究。 
分享到:
评论

相关推荐

    易语言 xml解析 易语言 xml解析 教程 带源码

    易语言XML解析是编程领域中的一个重要主题,尤其对于使用易语言进行开发的程序员来说,理解并掌握XML(可扩展标记语言)的解析方法是至关重要的。XML作为一种结构化数据存储和交换格式,广泛应用于网络通信、配置...

    XML解析器示例

    首先,我们来看XML加载的功能。在LabVIEW中,你可以使用内置的XML函数库来读取XML文件。这些函数通常包括“打开XML文件”和“解析XML文档”。通过“打开XML文件”,LabVIEW会创建一个指向XML文档的引用,然后“解析...

    C# XML解析方式

    根据给定文件中的标题、描述、标签以及部分内容,可以总结并深入探讨以下关于C#中XML解析的关键知识点: ### C#中的XML解析方式 #### 1. XML Text Reader(流式解析) - **简介**:在.NET框架中,`XMLTextReader`...

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    xml 解析 xml 解析几何

    在本文中,我们将深入探讨XML解析,以及如何在Java中处理XML文档。 XML解析是将XML文档转换为编程语言可以理解和操作的数据结构的过程。解析XML主要有两种方法:DOM(Document Object Model)和SAX(Simple API for...

    XML解析和生成工具

    本文将深入探讨XML解析和生成工具的相关知识,以及如何利用提供的`Markup.cpp`和`Markup.h`文件进行操作。 XML的结构: XML文档由一系列元素构成,每个元素都有一个开始标签和结束标签,如 `&lt;tag&gt;` 和 `&lt;/tag&gt;`。...

    STM32解析XML

    在本文中,我们将深入探讨如何在STM32F107上使用minixml库解析XML(可扩展标记语言)文档,这对于那些初次尝试在嵌入式环境中处理XML数据的开发者来说,是非常有价值的。 XML是一种通用的数据交换格式,它允许结构...

    C++ XML解析之TinyXML篇

    C++ XML解析之TinyXML篇

    java心电图xml解析.zip

    Java XML解析是Java开发中的一项重要技能,尤其是在处理结构化数据时。XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于配置文件、数据交换和文档存储等领域。本压缩包“java心电图xml解析....

    MusicXML 解析与布局

    这个项目涉及的是使用C++编程语言实现对MusicXML文件的解析和布局处理。 首先,MusicXML文件包含了音乐作品的完整结构,包括音符、节奏、动态标记、表情记号、和弦、调性、拍子等元素。解析MusicXML文件的过程是将...

    iphone开发之xml解析

    了解了基本的XML解析方法后,可以深入学习如何使用`NSXMLParser`或第三方库进行解析操作,例如设置解析器代理、处理XML节点事件、构建数据模型等。同时,掌握如何处理XML中的命名空间、实体引用、属性等特殊元素也是...

    xml.rar_XML c语言_c语言 xml_resolver_xml解析 c_解析xml

    从“xml解析器.cpp”的命名来看,可能采用了DOM或自定义的解析策略。 在C语言中,XML解析库如libxml2提供了DOM和SAX解析的功能,但在“xml.rar”中,开发者可能是基于C语言实现了一个轻量级的解析器,专为处理小到...

    适合嵌入式系统的开源XML解析器

    "minixml"就是这样一个专为嵌入式系统设计的开源XML解析器,它提供DOM(Document Object Model)支持,使得开发者能够方便地处理XML文档。 minixml的核心特性包括: 1. **轻量级**:minixml设计时考虑了嵌入式系统...

    XML解析器,用于解析XML文件

    理解和熟练使用XML解析器是任何IT专业人士的必备技能之一,无论是在移动应用、Web服务还是桌面应用程序中,XML解析都发挥着关键作用。了解和掌握TinyXML这样的解析库,可以帮助开发者更高效地处理XML数据。

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xml

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...

    C++ XML文件解析库 tinyxml2

    **C++ XML文件解析库 TinyXML2** XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于网络服务、配置文件、数据交换、对象序列化等领域。TinyXML2是一个轻量级、高效的C++库,专为解析和操作...

    XML解析支持库

    此外,良好的错误处理机制也是必不可少的,以应对XML解析过程中可能出现的异常情况,如语法错误、编码问题等。 在实际项目中,选择合适的XML解析库取决于需求,如文件大小、处理速度、内存限制、以及是否需要验证...

    比较通用的xml解析方法

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它以其结构化、可扩展性和易于解析的特点广泛应用于Web服务、配置文件、数据交换等领域。本篇文章将详细探讨一种比较通用的XML解析方法,...

    Adb uiautomator XML 解析, 脚本开发必备利器 模拟器/真机通用

    大家使用uiautomator dump 来获取界面元素xml后。基本都是用取文本中间或正则来分析的。这样不但效率低下,对一些特征不明显的xml元素很难取到。如果直接用xml来匹配就不存在这个问题了。并且可以基于本框架进行快速...

    xml_分析器.zip_XML VC_XML 解析_XML解析_vc解析xml_xml解析器

    在这个VC项目中,XML解析器实现了对XML文档的基本解析功能,包括读取XML文件、解析XML元素、处理属性和文本节点等。XML解析器通常分为两种类型:DOM(Document Object Model)和SAX(Simple API for XML)。DOM将...

Global site tag (gtag.js) - Google Analytics