- 浏览: 512805 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
chimpp55:
java.lang.NoSuchMethodError: or ...
基于Junit2.0的StrutsTestCase应用 -
opmic:
<property name="srcDir& ...
使用Eclipse与Ant进行java程序开发 -
univasity:
非常好,谢谢分享。
使用Eclipse与Ant进行java程序开发 -
peanut_sei:
exception handlers 译成 例外处理 倒是第 ...
JavaScript高级应用:例外处理
JAXP是Java API for XML Processing的缩写。JAXP API主要的部分在javax.xml.parsers 这个包中。在这个包中,向用户提供了两个最重要的工厂类,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文件会有很大的方便。
DOM
DOM的框架轮廓
DOM的API概述
一般而言,我们使用javax.xml.parsers.DocumentBuilderFactory来得到DocumentBuilder的一个实例。当然你也可以DocumentBuilder newDocument()方法来得到一个实现了org.w3c.dom.Document接口的空的Document对象。
DocumentBuilderFactory
它可以根据系统属性生成一个builder实例。
DocumentBuilder
用于处理生成Document。
更详细地api介绍,请参看DOM的官方API文档。
所以我们可以简单地这样:
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("test.xml");
就可以出得到一个Document。
实例:
我们依然处理test.xml。和SAX一样,也需要有paser。其实思路是非常简单而明晰的,上面我们已经说过,DOM是将所有的xml读入内存,以树的结构来处理的,所以呢,对节点的分析就是解决问题的关键,如下。
代码如下:
/*
* Test.java
* Created on 2004-4-10
* by Jiabo
*/
import org.w3c.dom.*;
/**
* Test
* Create on 2004-4-10 19:20:27
* by Jiabo
*/
public class Unmarshaller {
public Unmarshaller() {
}
public Customers UnmarshallCustomers(Node rootNode) {
Customers customers = new Customers();
Node n;
NodeList nodes = rootNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
if ("customer".equals(n.getNodeName())) {
customers.addCustomer(UnmarshallCustomer(n));
} else {
}
}
}
return customers;
}
public Customer UnmarshallCustomer(Node customerNode) {
Customer customer = new Customer();
Node n;
NodeList nodes = customerNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if ("id".equals(n.getNodeName())) {
customer.setId(UnmarshallText(n));
} else if ("name".equals(n.getNodeName())) {
customer.setName(UnmarshallText(n));
} else if ("address".equals(n.getNodeName())) {
customer.setAddress(UnmarshallText(n));
}
}
return customer;
}
public String UnmarshallText(Node textNode) {
StringBuffer buf = new StringBuffer();
Node n;
NodeList nodes = textNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.TEXT_NODE) {
buf.append(n.getNodeValue());
} else {
}
}
return buf.toString();
}
}
下面是如何驱动DOM去处理xml文件部分。还是先得到一个DocumentBuilderFactory工厂,在用他生成一个DocumentBuilder一个实例,在调用parse方法就可以分析这个xml文件了。
/*
* main.java
* Create @ 2004-4-27 22:18:41
* by Jiabo
*/
import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
/**
* main
* Create @ 2004-4-27 22:18:41
* by Jiabo
*/
public class Main {
public static void main(String args[]) {
Customers customers = null;
Document doc = null;
if (args.length != 1) {
System.err.println("Usage: cmd filename");
System.exit(1);
}
try {
Unmarshaller handler = new Unmarshaller();
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse( new File(args[0]) );
customers = handler.UnmarshallCustomers(doc.getDocumentElement());
} catch (Throwable t) {
t.printStackTrace();
}
System.out.println(customers);
}
}
总结:
这里是对xml处理的一个简介,力求简介,明了,以最快的速度帮助读者入门,所以,没有完整地使用库中的方法。
Xml文件的处理,对于webservice是基础的基础。而SAX和DOM又是xml处理中基础的基础。浊文请读者笑纳。
参考:
http://java.sun.com/xml/jaxp/docs.html
发表评论
-
Eclipse快捷键(引用转贴)
2004-09-23 11:47 875本文档从Eclipse软件上整理,是列出了标准的快捷键,未列出 ... -
java Excel API 简介(翻译)
2004-09-23 11:49 999java Excel API 简介(翻译) 版权声明:CSD ... -
spring-richclient开发swing应用程序
2005-09-03 18:00 1964Swing桌面应用程序的开发一直以来都是Java桌面开发者心中 ... -
spring-richclient开发swing应用程序 2
2005-09-03 18:07 12381 Main函数PetClinicStandalone里面基本 ... -
spring-richclient开发swing应用程序 3
2005-09-03 18:36 1801richclient-application-context. ... -
spring-richclient开发swing应用程序 4
2005-09-03 18:50 1281spring-rcp里面简单到极点(相对)的就算是菜单和导航条 ... -
关于Ajaxian JSF的设计原则
2005-09-09 16:05 695目前网上大大小小的Ajax Framework已经计算不清了, ... -
Velocity学习笔记1——Velocity是什么
2006-05-23 22:38 1118Velocity是一个基于Java的模版引擎。它允 ... -
Velocity学习笔记2——Velocity能够做什么
2006-05-24 11:06 999一个 ... -
JDBMonitor全攻略:10秒为任意数据库增加执行日志功能
2006-05-16 22:34 1287JDBMonitor是一个开源项目 ... -
使用JDBMonitor剖析Hibernate的实现机制
2006-05-17 18:20 1097使用JDBMonitor剖析Hibernate的实现机制现在j ... -
Log4j和JDBMonitor的比较
2006-05-17 18:21 851Log4j和JDBMonitor的比较Log4 ... -
Apache Commons Chain简明手册
2007-05-25 01:10 3280基本对象1. 接口。它是Commons Chain中最重要的接 ... -
开始使用Commons Chain (第一部分)
2007-05-25 01:12 1201作为程序开发人员,我 ... -
在JAVA中使用文档对象模型DOM经验小结
2007-07-13 23:20 828文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂 ... -
什么时候该用synchronized
2007-07-13 23:48 1416由于同一进程的多个线 ... -
XMLC在eclipse中的使用
2007-07-13 23:50 966关于外部插件的使用可以用link的方式做,如果简单的只把插件丢 ... -
J2EE架构学习者的6个最佳实践
2007-07-14 00:06 819虽然许多文章曾经讨论 ... -
面向Java程序员的Ajax:构建动态Java程序
2007-07-14 00:11 779Ajax(即异步 JavaScript 和 ... -
用java打包成zip
2007-08-21 11:51 1430--- 大家可能对于Zip格式的文件已经司空见惯了,我们可以使 ...
相关推荐
### 使用JAXP处理XML文件的关键知识点 #### JAXP简介 JAXP(Java API for XML Processing)是Java平台中处理XML文档的标准API之一。它主要包括两大块:DOM(Document Object Model)和SAX(Simple API for XML)。...
总结起来,JAXP的SAX解析器为Java开发者提供了一种高效、低内存消耗的方式来处理XML文档。通过实现SAX事件接口,开发者可以根据XML结构自定义解析逻辑,非常适合处理大型或复杂结构的XML文件。理解并熟练掌握SAX解析...
在Java中,处理XML文档时,Java API for XML Parsing(JAXP)是一个核心工具集,它提供了在Java环境中解析XML的接口和类。 **XML的基本概念** XML文档由元素、属性、文本和注释组成。元素是XML文档的基本构建块,...
标题"Jaxp_xml.rar_J2ME程序_j2me_j2me_xml_j2me网络"表明这个压缩包包含了一个示例,演示如何使用JAXP(Java API for XML Processing)在J2ME环境中解析XML文件。JAXP是Java平台上的一个标准接口,用于处理XML文档...
4. **解析XML文件**:使用`DocumentBuilder`的`parse(File source)`或`parse(InputStream is)`方法读取XML文件或流,返回一个`Document`对象。 5. **操作`Document`对象**:`Document`对象代表了XML文档的树形结构...
Java处理XML文件是Java开发中的常见任务,XML(Extensible Markup Language)作为一种可扩展标记语言,广泛用于数据交换、配置存储以及文档结构化等场景。本篇将详细讲解Java处理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文档的难度,同时确保跨...
了解JAXP的基本概念和使用方法,可以帮助开发者更有效地处理XML文档,同时避免被特定解析器限制。尽管JAXP自身并不提供XML解析功能,但它简化了与不同解析器的交互,使得XML处理在Java环境中更加灵活。
在 Java 中使用 DOM 方式解析 XML 文件需要使用 JAXP(Java API for XML Processing),首先需要创建一个解析器工厂,然后使用工厂创建一个具体的解析器对象。然后,使用解析器对象来解析 XML 文件,得到一个 ...
Java 中编写XML文件涉及到的主要技术是Java API for XML Processing(JAXP),这是一个用于XML文档处理的Java编程接口。JAXP提供了对DOM(Document Object Model)、SAX(Simple API for XML)和XSLT(Extensible ...
《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM、StAX、JDOM以及dom4j的应用程序编程接口,同时还囊括了最新版本的用于XML处理的Java应用程序编程接口(JAXP)和用于XML绑定...
通过这个练习,你将熟悉XML的基本操作,包括读取、创建和更新XML文件,以及如何利用DOM接口和JAXP在Java中处理XML。这将为你的IT职业生涯打下坚实的基础,特别是在需要处理结构化数据的项目中。
在Java编程中,处理XML文档的一个重要接口是Java API for XML Processing (JAXP),它包含了DOM(Document Object Model)、SAX(Simple API for XML)和XSLT等处理方式。 本文主要关注的是使用JAXP中的DOM接口来...
4. **解析XML文件**:使用Digester解析XML文件,并根据定义的规则创建Java对象。 #### 五、总结 通过上述介绍可以看出,Digester是一个非常有用的工具,它可以大大简化XML解析的过程。在实际开发中,尤其是处理...
在Java开发中,处理XML文件时通常会使用到特定的库,如给定的`xalan.jar`、`xercesImpl.jar`和`xml-apis.jar`。这些是XML解析的重要组成部分,接下来将详细介绍它们的功能和使用。 1. **xalan.jar**:这是Xalan-...
XML 文件的处理在 Java 中可以使用多种库和方法,例如使用 JAXP(Java API for XML Processing)库来解析 XML 文件,使用 DOM(Document Object Model)库来操作 XML 文件,使用 SAX(Simple API for XML)库来读取 ...
3. **加载XML源文档**:使用`SAXSource`或`DOMSource`加载XML文档,这取决于源文档的形式。如果源文档是文件,则可以使用`StreamSource`加载。 4. **设置输出目标**:通常情况下,输出目标可以是文件、控制台或者...