为了使用 XML 文件中的信息,必须解析文件以创建一个 Document
对象。
Document 对象是一个接口,因而不能直接将它实例化;一般情况下,应用程序会相应使用一个工厂。准确的过程因实现而异,但是基本思想是相同的。
Java 环境中,解析文件是一个三步过程:
- 创建
DocumentBuilderFactory
。 DocumentBuilderFactory 对象创建DocumentBuilder
。 - 创建
DocumentBuilder
。DocumentBuilder
执行实际的解析以创建Document
对象。 - 解析文件以创建
Document
对象。
现在您可以开始构建应用程序了。
基本的应用程序
首先创建一个基本的应用程序,即一个名为 OrderProcessor
的类。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import org.w3c.dom.Document;
public class OrderProcessor {
public static void main (String args[]) {
File docFile = new File("orders.xml");
Document doc = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(docFile);
} catch (Exception e) {
System.out.print("Problem parsing the file: "+e.getMessage());
}
}
}
首先,Java 代码导入必要的类,然后它创建 OrderProcessor
应用程序。本教程中的例子仅处理一个文件,因此为简洁起见,应用程序包含了对该文件的直接引用。
因此 Document
对象可以在以后使用,应用程序把它定义在 try-catch
块之外。
在 try-catch
块中,应用程序创建了 DocumentBuilderFactory
,然后再使用它来创建 DocumentBuilder
。 最后,DocumentBuilder
解析文件以创建 Document
。
解析器设置
使用 DocumentBuilder
创建解析器的优点之一在于能够控制 DocumentBuilderFactory
创建的解析器上的各种设置。例如,可以设置解析器验证文档:
...
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(docFile);
} catch (Exception e) {
...
Java 的 DOM Level 2 实现允许通过以下方法控制解析器的参数:
setCoalescing():决定解析器是否要将 CDATA 节点转换为文本,以及是否要和周围的文本节点合并(如果适
用的话)。其默认值为 false。
setExpandEntityReferences(): 确定是否要展开外部实体引用。如果为 true,外部数据将插入文档。其默
认值为 true。setIgnoringComments():确定是否要忽略文件中的注释。其默认值为 false。
setIgnoringElementContentWhitespace():确定是否要忽略元素内容中的空白(类似于浏览器对待 HTML
的方式)。其默认值为 false。
setNamespaceAware():确定解析器是否要注意名称空间信息。其默认值为 false。
setValidating():默认情况下,解析器不验证文档。将这个参数设置为 true 可打开验证功能。
解析器异常
由于在创建解析器时存在所有这些可能性,其中许多地方都可能会出错。正如这里的例子所表明的,应用程序把所有这些内容转储到一个单一的通用
Exception
中,就调试而言,这样可能不是很有帮助。为更好地查明问题,您可以捕捉与创建和使用解析器的各方面相关的特定异常:
... try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(docFile); } catch (javax.xml.parsers.ParserConfigurationException pce) { System.out.println("The parser was not configured correctly."); System.exit(1); } catch (java.io.IOException ie) { System.out.println("Cannot read input file."); System.exit(1); } catch (org.xml.sax.SAXException se) { System.out.println("Problem parsing the file."); System.exit(1); } catch (java.lang.IllegalArgumentException ae) { System.out.println("Please specify an XML source."); System.exit(1); } ...
一旦解析器已创建了一个
Document
,应用程序就能单步调试它以检查数据。