今天看了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:
|
//
获得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 ]));
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 ]));
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 树
}
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 树
}
//
获得一个 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 " );
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) “规范,标准”这几个字
蚊子在咬我,该回家了。