当前位置:编程学习 > XML/UML >>

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="paperback" >

        <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开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,