今天看了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) “规范,标准”这几个字
蚊子在咬我,该回家了。