DOM操作XML文件
使用DOM方式操作XML文件,即是和DOM树打交道的过程:在构建XML文件时,首先构建一棵DOM树,然后将该树状结构写成XML文件;在解析XML文件时,首先将源XML文件解析成一棵DOM树,然后遍历这棵DOM树、或从DOM树中查找需要的信息。
关于DOM树中节点类型、不同节点具有的接口、特性、限制等信息可以参考《DOM树节点解析》,本文只关注如何构建XML文件与解析XML文件。在构建和解析XML文件中,都以w3school中的books.xml文件的内容为例:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<bookcategory="web"cover="易做图back" >
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
</bookstore>
我们都知道Java是一门面向对象的语言,因而我们需要尽量以面向对象的思想我编写代码,面向对象编程其中一个比较重要的特点就是基于对象编程,因而我们在编写这个测试代码时,也尽量的基于对象操作,而不是像过程式的语言,有一点信息做一点操作。
在这里,对XML文件中定义的book元素,我们使用Book对象与其对应:
public class Book {
private String category;
private String cover;
private TitleInfo title;
private List<String> authors;
private int year;
private double price;
...
public static class TitleInfo {
private String title;
private String lang;
...
}
}
根据XML文件定义构建Book实例:
public class W3CBooksBuilder {
public static List<Book> buildBooks() {
List<Book> books = new ArrayList<Book>();
books.add(buildHarrayBook());
books.add(builcEverydayItalian());
books.add(buildLearningXML());
books.add(buildXQueryKickStart());
return books;
}
public static Book buildHarrayBook() {
Book book = new Book();
book.setCategory("children");
book.setTitle(new TitleInfo("Harry Potter", "en"));
book.setAuthors(Arrays.asList("J K. Rowling"));
book.setYear(2005);
book.setPrice(29.99);
return book;
}
public static Book builcEverydayItalian() {
...
}
public static Book buildLearningXML() {
...
}
public static Book buildXQueryKickStart() {
...
}
}
DOM解析XML文件
DOM使用DocumentBuilder类来解析XML文件,它提供parse方法,将XML文件解析成一棵DOM树,并返回Document实例:
public Document parse(InputStream is);
public Document parse(InputStream is, String systemId);
public Document parse(String uri);
public Document parse(File f);
public abstract Document parse(InputSource is);
DocumentBuilder类还提供了判断当前解析器是否存在命名空间解析、验证等配置,以及提供了设置EntityResolver、ErrorHandler的接口。这里使用EntityResolver和ErrorHandler只是重用SAX的API,并不表示DOM解析的内部实现一定要基于SAX,然而貌似JDK自带的DOM解析内部使用的引擎就是SAX。T_T
public abstract boolean isNamespaceAware();
public abstract boolean isValidating();
public abstract void setEntityResolver(EntityResolver er);
public abstract void setErrorHandler(ErrorHandler eh);
DocumentBuilder提供了 构建Document实例的工厂方法,在以编程方式构建DOM树时,首先需要构建Document实例,继而使用Document实例构建其余节点类型,而构建Document实例需要通过DocumentBuilder类来实现:
public abstract Document newDocument();
最后,DocumentBuilder还提供了一些额外的方法,比如重置DocumentBuilder实例的状态,以重用该DocumentBuilder;获取DOMImplementation实例;获取Schema实例;判断XInclude处理模式。
public void reset();
public abstract DOMImplementation getDOMImplementation();
public Schema getSchema();
public boolean isXIncludeAware();
DocumentBuilder是一个抽象类,要获取DocumentBuilder实例,需要使用DocumentBuilderFactory。DocumentBuilderFactory提供了多种查找DocumentBuilder实现类的方法;DocumentBuilderFactory本身也是抽象类,它提供了两个静态方法来创建DocumentBuilderFactory实例:
public static DocumentBuilderFactory newInstance();
public static DocumentBuilderFactory newInstance(String factoryClassName, ClassLoader classLoader);
不带参数的newInstance()方法使用以下步骤查找DocumentBuilderFactory的实现类:
1. 查看系统属性中是否存在javax.xml.parsers.DocumentBuilderFactory为key的定义,如果存在,则使用该key定义的值作为DocumentBuilderFactory的实现类。
2. 查找${java.home}/lib/jaxp.properties属性文件中是否存在javax.xml.parsers.DocumentBuilderFactory为key的定义,若存在,则使用该属性文件中以该key定义的值作为DocumentBuilderFactory
补充:Web开发 , 其他 ,