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) “规范,标准”这几个字

蚊子在咬我,该回家了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值