注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

韬光养晦

路漫漫其修远兮,吾将上下而求索

 
 
 

日志

 
 

XML的解析  

2008-03-02 14:28:09|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

趁着学期刚开始,导师准备的锻炼项目还没有开始,看看了关于XML的解析的资料。摘抄、整理如下:

XML解析指的是将一个xml文档或者连描述xml文档的dtd文档或schema文档分解,从中找出需要的信息,进而进行一些编辑操作。


  • 解析XML文档通常使用的API有DOM、SAX、JDOM、dom4j等等。
  • DOM是W3C组织推荐的处理XML文档的标准接口,而SAX是社区讨论的产物,是一种事实上的标准。JDOM和dom4j为Java程序员提供了一个简单而又高效的访问XML文档的方式,特别是dom4j,不但功能强大,而且性能优异,可以作为今后解析XML文档的首选API。
  1. DOM在内存中以节点树的形式表示XML文档,由于树在内存中是持久的,因此可以在任何时候对树的节点进行导航,并对其进行修改。DOM的缺点是:对于特别大的文档,解析和加载文档将会变得很满,而且会消耗大量的资源。
  2. SAX是一种事件驱动的API。SAX解析器在解析XML文档的时候会触发一系列的事件,当发现一个标记时,它可以激活一个回调方法,告诉该方法找到一个标记。SAX不存储先前的数据,因此不能对XML文档进行修改。SAX解析速度快,对内存要求的,这对于解析大文档来说是一个优点。
  3. 和DOM类似,JDOM也用对象树来表示XML文档。JDOM解析器底层使用SAX解析器来分析XML文档,构建JDOM树。JDOM为Java程序员提供了一种非常简便的访问XML文档的API。不过相对于dom4j来说,JDOM的性能较差。
  4. dom4j和JDOM非常类似,不过功能更为强大,性能也更为优异。dom4j在API中集成了对XPath的支持,提供了对于大文档的基于事件的处理模型。dom4j自带了一个XML解析器Aelfred2,在没有其他解析器可用的情况下,将使用这个解析器。
  5. XML编组库形式的解析,该方法介于对象模型和事件方法之间。

    其思想是从 XML Schema 生成一个对象模型而不是通用模型(如 DOM),解析器生成更加针对所用词汇表的数据模型。比方说,如果词汇表处理的是发货单,那么可以预料其中会包含发送方、接收方、日期、产品类别、产品标 识、单价和总价。DOM 将这些元素映射到一个一般性的元素类。编组库 为发送方、接收方、日期、产品类别、产品标识、单价、总价和文档中出现的其他元素创建专门的类。

    从处理的是根据词汇表定制(与根据应用程序的需要定制可能相同,也可能不同)的而不是通用数据模型这方面来讲,编组库具备事件 API 的一些优点。


使用哪一种解析API主要依据于对象的不同:是否是大文档对象、是否要求与语言无关等等。

下面贴出DOM和SAX解析开始部分的Java代码。之余其余的API,在看过API文档之后很容易掌握。

  • DOM的代码:

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        System.out.println(dbf.getClass().toString());
        try {
           DocumentBuilder db=dbf.newDocumentBuilder();
           Document doc=db.parse(new File("students.xml"));
         } catch (ParserConfigurationException e) {
                   e.printStackTrace();
         } catch (SAXException e) {
                   e.printStackTrace();
         } catch (IOException e) {
                   e.printStackTrace();
         }

 

  • SAX的代码一

public static void main(String[] args) {
        SAXParserFactory spf=SAXParserFactory.newInstance();
        try {
          SAXParser sp=spf.newSAXParser();
           sp.parse("build.xml", new SAXPrinter());
        } catch (ParserConfigurationException e) {
               e.printStackTrace();
        } catch (SAXException e) {
               e.printStackTrace();
        } catch (IOException e) {
               e.printStackTrace();
        }
 } 

 

  • SAX的代码二

  SAXParserFactory spf=SAXParserFactory.newInstance();
  try {
         SAXParser sp=spf.newSAXParser();
         sp.parse("students.xml",slu);//slu为继承了DefaultHandler的类(该类实现了一些事件回调方法)的对象。
  } catch (ParserConfigurationException e) {
         e.printStackTrace();
  } catch (SAXException e) {
         System.out.println(e.getMessage());
  } catch (IOException e) {
         e.printStackTrace();
  }

 

PS:回调方法指的是由代码自己调用的方法,其内容通常需要自己来写,但是函数名和参数个数、类型都固定。如当某个事件发生时,XML解析器就调用一个相应的方法来对其进行处理,这个相应的方法就属于回调方法。

  评论这张
 
阅读(269)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018