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的框架轮廓
系统是从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文件的关键知识点 #### JAXP简介 JAXP(Java API for XML Processing)是Java平台中处理XML文档的标准API之一。它主要包括两大块:DOM(Document Object Model)和SAX(Simple API for XML)。...
在Java中,处理XML文档时,Java API for XML Parsing(JAXP)是一个核心工具集,它提供了在Java环境中解析XML的接口和类。 **XML的基本概念** XML文档由元素、属性、文本和注释组成。元素是XML文档的基本构建块,...
总结起来,JAXP的SAX解析器为Java开发者提供了一种高效、低内存消耗的方式来处理XML文档。通过实现SAX事件接口,开发者可以根据XML结构自定义解析逻辑,非常适合处理大型或复杂结构的XML文件。理解并熟练掌握SAX解析...
JAXP是Java平台上的一个标准接口,用于处理XML文档,包括解析、转换和查询。 首先,让我们深入理解J2ME。J2ME是一种简化版的Java,主要设计用于资源有限的移动设备,如手机、PDA等。尽管它的功能相对有限,但依然...
本教程将深入探讨如何在Java环境中使用JAXP处理XML。 一、XML基础 XML文档由元素、属性、文本内容、命名空间等构成,具有自描述性。元素是最基本的构建块,如`<employee>`,它们可以嵌套形成树状结构。属性提供附加...
JAXP是Java平台上的标准API,它提供了处理XML的两种主要方法:解析和转换。在解析方面,JAXP支持DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器将整个XML文档加载到内存中形成一个树形结构,...
Java API for XML Processing(JAXP)是Java平台上的一个标准接口,用于处理XML文档。JAXP提供了解析XML文档和转换XML数据的能力,它包括三个主要组件:SAX(Simple API for XML)、DOM(Document Object Model)和...
JAXP并非旨在革新XML处理的方式,也不提供额外的语法分析功能,相反,它扮演着一个重要的角色——一个抽象层,旨在简化通过DOM(Document Object Model)和SAX(Simple API for XML)处理XML文档的难度,同时确保跨...
《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM、StAX、JDOM以及dom4j的应用程序编程接口,同时还囊括了最新版本的用于XML处理的Java应用程序编程接口(JAXP)和用于XML绑定...
JavaBeans用于创建可重用的业务组件,JMS(Java Message Service)处理消息传递,JAXP处理XML,以及JTA(Java Transaction API)管理原子事务。 JSP的引入解决了CGI(Common Gateway Interface)在早期网络开发中...
JSR 206定义了Java API for XML Processing(JAXP)1.3规范,该规范是Java平台处理XML文档的标准方式之一。此版本为JAXP带来了诸多改进和新特性,进一步提升了Java应用程序处理XML数据的能力。 #### 二、背景与意义...
在Java EE 5中,开发者可以利用JAXP处理XML数据,与其它系统交换信息。 总结,Java EE 5通过引入一系列库和规范,极大地提升了企业级应用开发的效率和质量。这些库涵盖了从Web界面到数据库访问、事务处理、消息传递...
JAXP,全称Java API for XML Processing,是Sun Microsystems为Java平台推出的一个标准接口,用于处理XML文档。JAXP的主要目的是提供一个抽象层,使得开发者能够在不同的XML解析器之间进行切换,而无需修改代码。...
Java处理XML文件是Java开发中的常见任务,XML(Extensible Markup Language)作为一种可扩展标记语言,广泛用于数据交换、配置存储以及文档结构化等场景。本篇将详细讲解Java处理XML的相关知识点,主要涵盖以下几个...
9. **XML基础和进阶**:XML用于数据交换,DTD和Schema定义结构,DOM、SAX和JAXP处理XML,工具如dom4j、JDOM简化操作。 10. **Web服务**:通过JAXWS2和SAAJ标准实现,WSDL和SOAP定义服务接口,CXF框架支持Web服务...
17. Web服务是一种跨平台、跨语言的信息交换方式,如使用WSDL描述服务,JAXP处理XML,JAXM处理SOAP消息。UDDI用于服务发现。 【BS与CS架构】 18. BS(Browser/Server)架构是基于浏览器的客户端,而CS(Client/...
17. **Web Service**:提供跨平台的远程调用服务,WSDL(Web Services Description Language)描述服务,JAXP处理XML,JAXM(Java API for XML Messaging)处理消息,SOAP定义传输协议,UDDI(Universal Description...
在处理XML解析中的错误时,Java开发者面临着一系列挑战。随着技术的发展,XML解析已经成为Java编程不可或缺的一部分,从JAXP到JAXB,再到JAX-WS,这些API简化了XML处理,但也带来了新的问题。高级API的抽象化虽然...
4. **JAXP(Java API for XML Processing)**:JAXP提供了XML解析和转换的接口,支持DOM、SAX和XSLT,是Java平台上处理XML的基础。 5. **XPath**:XPath是用于在XML文档中查找信息的语言,它可以根据表达式选取节点...
3. **XML与JSON**:虽然名称中有XML,但实际应用中,AjaxP更多地采用JSON(JavaScript Object Notation)作为数据交换格式,因为JSON更轻量级,解析更快。 二、AjaxP在通用查询中的应用 1. **实时搜索**:在搜索框...