XML学习笔记之解析器

 今天看了IBM的XML教程,可以说XML的应用领域非常广,其中java操作XML进行读写最为关键

之前工作中也用Dom4j写过XML的读写程序,但开头部分完全是机械式的似懂非懂,今天懂了一个重要的问题

解析器

解析指的是读取XML文件并处理的过程

解析器是一个完成解析XML文件任务的程序

市面上常见的解析方式有SAX,DOM

而Sun公司的JAXP

严格地说,JAXP 是 API,但是将其称为抽象层更准确。它不提供处理 XML 的新方式,不补充 SAX 或 DOM,也不向 Java 和 XML 处理提供新功能

和java servlet相比照,原理是一样的,Sun公司给出标准,各个厂商开发符合这个标准的产品,对咱们程序员来说

应用的是统一的API,又如JDBC,所以java的学习要学一个方法、思路,很多思想都是一致的,所谓神似形不同

 这点清楚了,就会发现DOM和SAX的建立过程差别细微

SAX:

清单 1. 使用 SAXParserFactory


import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
// JAXP
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
// SAX
import org.xml.sax.AttributeList;
import org.xml.sax.HandlerBase;
import org.xml.sax.SAXException;
public class TestSAXParsing {
 
public static void main(String[] args) {
 
try {
 
if (args.length != 1{
 System.err.println (
"Usage: java TestSAXParsing [filename]");
 System.exit (
1);
 }

 
// 获得SAX 语法分析器类厂
 SAXParserFactory factory = SAXParserFactory.newInstance();
 
//设置设置名称空间敏感性选项,关掉确认选项
 factory.setValidating(true);
 factory.setNamespaceAware(
false);
 SAXParser parser 
= factory.newSAXParser();
 parser.parse(
new File(args[0]), new MyHandler());
 }
 catch (ParserConfigurationException e) {
 System.out.println(
"The underlying parser does not support " +
 
" the requested features.");
 }
 catch (FactoryConfigurationError e) {
 System.out.println(
"Error occurred obtaining SAX Parser Factory.");
 }
 catch (Exception e) {
 e.printStackTrace();
 }

 }

}

class MyHandler extends HandlerBase {
 
//通过 DocumentHandler, ErrorHandler等实现的SAX回调函数
}

 

 

 使用 SAX 语法分析器

//获得SAXP的一个实例
 SAXParser saxParser = saxFactory.newSAXParser();
 
//查看是否支持 Validate 选项
 boolean isValidating = saxParser.isValidating();
 
//查看是否支持 namespace 选项
 boolean isNamespaceAware = saxParser.isNamespaceAware();
 
// 运用一个File 和一个SAX HandlerBase 的实例进行多种形式的语法分析
 saxParser.parse(new File(args[0]), myHandlerBaseInstance);
 
// 运用一个 SAX InputSource实例 和一个 SAX HandlerBase 实例
 saxParser.parse(mySaxInputSource, myHandlerBaseInstance);
 
//运用一个 InputStream 实例和一个SAX HandlerBase 实例
 saxParser.parse(myInputStream, myHandlerBaseInstance);
 
// 运用一个 URI 和一个SAX HandlerBase 实例
 saxParser.parse("http://www.newInstance.com/xml/doc.xml", myHandlerBaseInstance);
 
//获得底层的(封装)SAX 语法分析器 
 org.xml.sax.Parser parser = saxParser.getParser();
 
//利用底层的语法分析器
 parser.setContentHandler(myContentHandlerInstance);
 parser.setErrorHandler(myErrorHandlerInstance);
 parser.parse(
new org.xml.sax.InputSource(args[0]));

DOM 语法分析器类厂

清单 3. 使用文档构建器类厂

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
// JAXP
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
// DOM
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class TestDOMParsing {
 
public static void main(String[] args) {
 
try {
 
if (args.length != 1{
 System.err.println (
"Usage: java TestDOMParsing [filename]");
 System.exit (
1);
 }

 
// 获得 Document Builder Factory
 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 
//打开确认选项,关掉名称空间敏感性选项。
 factory.setValidating(true);
 factory.setNamespaceAware(
false);
 DocumentBuilder builder 
= factory.newDocumentBuilder();
 Document doc 
= builder.parse(new File(args[0]));
 
// 从DOM 数中打印文档,并加一初始空格
 printNode(doc, "");
 
// 在这里也可以对 DOM 文档进行修改
 }
 catch (ParserConfigurationException e) {
 System.out.println(
"The underlying parser does not support the requested features.");
 }
 catch (FactoryConfigurationError e) {
 System.out.println(
"Error occurred obtaining Document Builder Factory.");
 }
 catch (Exception e) {
 e.printStackTrace();
 }

 }

 
private static void printNode(Node node, String indent) {
 
// 打印 DOM 树
}

 

清单 4. 使用 JAXP DocumentBuilder

//获得一个 DocumentBuilder 实例
 DocumentBuilder builder = builderFactory.newDocumentBuilder();
 
//查看是否支持 Validate 选项
 boolean isValidating = builder.isValidating();
  
//查看是否支持 namespace 选项
 boolean isNamespaceAware = builder.isNamespaceAware();
 
// 设置一个 SAX ErrorHandler
 builder.setErrorHandler(myErrorHandlerImpl);
 
// 设置一个 SAX EntityResolver
 builder.setEntityResolver(myEntityResolverImpl);
 
// 运用多种方法对 file 进行语法分析
 Document doc = builder.parse(new File(args[0]));
 
// 运用 SAX InputSource 
 Document doc = builder.parse(mySaxInputSource);
 
// 运用 InputStream
 Document doc = builder.parse(myInputStream, myHandlerBaseInstance);
 
// 运用 URI
 Document doc = builder.parse("http://www.newInstance.com/xml/doc.xml");

从Servlet,JDBC,到EJB无处不在体现J2EE(现在叫JAVAEE) “规范,标准”这几个字

蚊子在咬我,该回家了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值