`
Janne
  • 浏览: 39622 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

JAXP处理xml

阅读更多

JAXP是java API for xml PRocessing的缩写,Java API主要的部分在javax.xml.parders这个包中。在这个包中,向用户提供了2个主要的工厂类:SAXParserFactory和DocumentBuilderFactory,相应的,提供了SAXParser和DocumentBuilder两个类

SAX是由XML-DEV定义的;DOM是由W3C定义的。让我们来看看这些API库。

 

  • javax.xml.parsers
    JAXP API, 定义个SAX和DOM的一个通用接口
  • org.w3c.dom
    定义了DOM中的所有组件
  • org.xml.sax
    定义了SAX的所有API
  • javax.xml.transform
    定义了XSLT API,使用它,你可以将XML转化为一般的可视的页面。

 

SAX指一种"事件驱动"的处理方式,他对XML文件连续地一个对象一个对象地操作,由于它的这个特点,所以它可以用于服务器端或者对速度有非凡要求的地方。

 

相比较而言DOM是个使用起来更简单些。他是将所有个XML数据全部读到内存里面,然后使用"树"结构将这些数据组织起来,用户可以对XML的数据进行任意的操作。

 

至于XSLT,我们在这里就不介绍太多,假如感爱好请参考相应的资料。我们还是先看看SAX。

 

SAX

 

SAX的框架轮廓

 

使用JAXP处理XML文件(图一)

 

系统是从SAXParserFactory产生parser的实例开始的。一个parser中包含了一个 SAXReader对象,当这个parser调用parse方法的时候,这个reader就调用回调方法已实现这个应用;而这些方法呢?是定义在 ContentHandler,ErrorHandler,DTDHandler and EntityResolver接口中的。

 

以下是对SAX API库的概述:

 

  • SAXParserFactory
    SAXParserFactory是一个根据系统属性生成parser实例的一个对象。
  • SAXParser
    SAXParser是一个定义了不同种类的parser()方法的接口。一般而言,你向parser传XML数据后,使用DefaultHandler再来处理,系统就会调用一些合适的方法来处理XML文件,这样的一种处理方法是最为简单的。
  • SAXReader
    SAXParser包含了一个SAXReader,通常你是不需要关心它的,但是当你要使用 SAXReader的getXMLReader()方法的时候,你就需要配置他。简言之,SAXParser就是一个与SAX事件通讯的处理器,这样,你 就可以使用自定义的handler。
  • DefaultHandler
    DefaultHandler 实现了 ContentHandler, ErrorHandler, DTDHandler, 和EntityResolver 接口 (当然其中有一些null方法), 假如你感爱好的话,你可以在你的程序中重载它。
  • ContentHandler
    当读到XML的tag时,就会调用到这个接口中的startDocument, endDocument, startElement, 和 endElement 方法。同时,这个接口还定义了characters 和processingInstrUCtion,方法,分别地,当parser碰到XML的element或者inline processing instruction的时候调用。
  • ErrorHandler
    当碰到不同类型的错误的时候分别调用相应的"错误"方法,这些方法包括:error,fatalError和warning。
  • DTDHandler
    该接口所定义的方法只用在处理DTD信息的时候。
  • EntityResolver
    给接口中的resolveEntity方法只在parser碰到URI标识数据的时候才调用。

 

更具体地api介绍,请参看SAX的官方API文档。

 

例子:

 

在我们这个例子中,我们处理一个xml文件,然后将其值set到对象中。这是一个非经常用的使用情况。以下就是我们需要处理的xml文件。

Test.xml

<?xml version="1.0" ?> 
<customers>
  <customer>
    <id>#001</id> 
    <name>Micke</name> 
    <address>Najing</address> 
  </customer>
  <customer>
    <id>#002</id> 
    <name>Car</name> 
    <address>Suzhou</address> 
  </customer>
  <customer>
    <id>#003</id> 
    <name>Jimmy</name> 
    <address>ChengDu</address> 
  </customer>
  <customer>
    <id>#004</id> 
    <name>Henry</name> 
    <address>Xi'an</address> 
  </customer>
</customers>

 

这是一个非常简单的xml文件,customers中间有数个customer,每一个customer中包含三个属性id, name, address。

 

根据这个xml文件,我们将Date Object设置如下。

/* 
 * Customers.java
 * Create @ 2004-4-27 22:04:45
 * by Jiabo
 */
import java.util.*;
/**
 * Customers
 * Create @ 2004-4-27 22:04:45
 * by Jiabo
 */
public class Customers {
  private Vector customers;

  public Customers() {
    customers = new Vector();
  }

  public void addCustomer(Customer customer) {
    customers.add(customer);
  }

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

    for (int i = 0; i < customers.size(); i++) {
      buf.append(customers.elementAt(i)).append(newline);
    }
    return buf.toString(); 
  }
}

class Customer {
  private String id;
  private String name;
  private String address;

  /**
   * @return
   */
  public String getAddress() {
    return address;
  }

  /**
   * @return
   */
  public String getId() {
    return id;
  }

  /**
   * @return
   */
  public String getName() {
    return name;
  }

  /**
   * @param string
   */
  public void setAddress(String string) {
    address = string;
  }

  /**
   * @param string
   */
  public void setId(String string) {
    id = string;
  }

  /**
   * @param string
   */
  public void setName(String string) {
    name = string;
  }
	
  public String toString(){
    return "Customer: ID='" + id + "' Name='" + name + 
      "' Address='" + address + "'";
  }
}

 

接下来是xml的处理器。

/*
 * Test.java
 * Created on 2004-4-10
 * by Jiabo
 */
import java.util.*;

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
/**
 * Test
 * Create on 2004-4-10 19:20:27
 * by Jiabo
 */
public class Unmarshaller extends DefaultHandler {
  private Customers customers;
  private Stack stack;
  private boolean isStackReadyForText;
  private Locator locator;

  /**
   * init
   */
  public Unmarshaller() {
    stack = new Stack();
    isStackReadyForText = false;
  }
  /**
   * @return customers
   */
  public Customers getCustomers() {
    return customers;
  }
  /**
   * callbacks
   */
  public void setDocumentLocator(Locator rhs) {
    locator = rhs;
  }

  //==========================================
  // SAX DocumentHandler methods
  //==========================================

  public void startElement(
    String uri,
    String sName,
    String qName,
    Attributes attrs) {
      isStackReadyForText = false;

      if (sName.equals("customers")) {
        stack.push(new Customers());
      } else if (sName.equals("customer")) {
        stack.push(new Customer());
      } else if (
        sName.equals("id")
         sName.equals("name")
         sName.equals("address")) {
          stack.push(new StringBuffer());
          isStackReadyForText = true;
      } else {
      }
    }

  public void endElement(String namespaceURI, String sName, String qName){
    isStackReadyForText = false;
    Object temp = stack.pop();

    if (sName.equals("customers")) {
      customers = (Customers) temp;
    } else if (sName.equals("customer")) {
      ((Customers) stack.peek()).addCustomer((Customer) temp);
    } else if (sName.equals("id")) {
      ((Customer) stack.peek()).setId(temp.toString());
    } else if (sName.equals("name")) {
      ((Customer) stack.peek()).setName(temp.toString());
    } else if (sName.equals("address")) {
      ((Customer) stack.peek()).setAddress(temp.toString());
    }
  }

  public void characters(char[] data, int start, int length) {
    if (isStackReadyForText == true) {
      ((StringBuffer) stack.peek()).append(data, start, length);
    } else {
    }
  }
}

 

在这里我们处理xml文 件的思路非常简单,就是使用一个栈,碰到"<"表示element的开始,然后就看与我们既定的Data Object的名字是否相符合,符合就new一个该对象,并将其压栈;不符合就什么都不做,sax的处理框架就会自己去处理下一个element。而当碰 到"/>"的时候我们还是看的他名字与DataObject的名字是否相符,相符合的话就出栈,然后set进对象里面。如此循环,就处理完了我们上 面那个简单得xml文件。

 

我们需要做的事情就只有这些。其他如何处理的,handler回自己调用相应的startElement,endElement等方法去处理。

 

以下是程序的入口:

/* 
 * main.java
 * Create @ 2004-4-27 22:18:41
 * by Jiabo
 */
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
/**
 * main
 * Create @ 2004-4-27 22:18:41
 * by Jiabo
 */
public class Main {
  public static void main(String args[]) {

    Customers customers = null;
    if (args.length != 1) {
      System.err.println("Usage: cmd filename");
      System.exit(1);
    }
    try {
      Unmarshaller handler = 	new Unmarshaller();
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser saxParser = factory.newSAXParser();
			
      File file = new File(args[0]);
      InputSource src = new InputSource(new FileInputStream(file));
      saxParser.parse( src ,handler); 

      customers = handler.getCustomers();
    } catch (Throwable t) {
      t.printStackTrace();
    }

    System.out.println(customers);
  }
}

 

如前面所述,通过一个工厂方法得到一个SAXParser的实例,然后就可以编译这个xml文件了。这样你就可以得到如下结果:

Customer: ID ='#001' Name='Micke' Address='Najing' 
Customer: ID ='#002' Name='Car' Address='Suzhou' 
Customer: ID ='#003' Name='Jimmy' Address='ChengDu' 
Customer: ID ='#004' Name='Henry' Address='Xi'an'

 

Sax的系统框架中还有其他得好些方法,读者不妨试试他们是如何使用的,这对以后实战处理xml文件会有很大的方便。

 

 

 

分享到:
评论

相关推荐

    使用JAXP处理XML文件.pdf

    JAXP是JAVA API for XML Processing的缩写。本教程属于清晰版

    Java and XML, 3rd Edition

    《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM、StAX、JDOM以及dom4j的应用程序编程接口,同时还囊括了最新版本的用于XML处理的Java应用程序编程接口(JAXP)和用于XML绑定...

    JAVA与XML.rar

    《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM、StAX、JDOM以及dom4j的应用程序编程接口,同时还囊括了最新版本的用于XML处理的Java应用程序编程接口(JAXP)和用于XML绑定...

    J2EE中XML配置文件的读取处理

    Java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式(Java中也有 Propertiesy这样的类专门处理这样的属性配置文件)。使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    使用dom4j操作xml

    Dom4j是一个开源的Java XML 解析处理工具,用来读写XML文件,它应用于Java平台,采用了Java集合框架并完全支持DOM, SAX和JAXP。具有性能优异、功能强大和极易使用的特点。可以作为解析XML文档析首先API。本文讲述了...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    dom4j---xml解析jar包

    dom4j是一个简单的开源库,用于处理XML、 XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    java解析xml及4种常用解析比较

    对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。 DOM解析器把XML文档转化为一个包含其内容...

    Java编程中更新XML文档的常用方法

     JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    java语言与XML教程

    这部书是理解java、与XML、处理的利器,用在服务器web端的学习

    Java语言编程中更新XML文档的四种常用方法

    本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析...JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。 JAXP支持DOM、SAX、XSLT等标准。

    DOM和SAX概念的总结

    通常我们使用根据以下这些模型创建的API 来分析和操纵XML结构,这些模型可以是基于对象(基于树)的,如文档对象模型...而Java API for XML Parsing(JAXP)和MSXML提供了使用 DOM、SAX等处理XML文档的通用接口。

    Java 2技术内幕(Part1)

    使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和Java 3D向应用程序中添加多媒体 使用JavaMail开发自动化电子邮件应用程序 将陈旧的系统转换为Web服务 学习如何...

    Java 2技术内幕(Part2)

    使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和Java 3D向应用程序中添加多媒体 使用JavaMail开发自动化电子邮件应用程序 将陈旧的系统转换为Web服务 学习如何...

    Java 2技术内幕(Part5)

    使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和Java 3D向应用程序中添加多媒体 使用JavaMail开发自动化电子邮件应用程序 将陈旧的系统转换为Web服务 学习如何...

    Java 2技术内幕(Part3)

    使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和Java 3D向应用程序中添加多媒体 使用JavaMail开发自动化电子邮件应用程序 将陈旧的系统转换为Web服务 学习如何...

    Java 2技术内幕(Part4)

    使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和Java 3D向应用程序中添加多媒体 使用JavaMail开发自动化电子邮件应用程序 将陈旧的系统转换为Web服务 学习如何...

Global site tag (gtag.js) - Google Analytics