花开有时

花开有时,花落有时,来有时,去有时。不撕扯,只关切;不纪念,只牵挂;不感动,只明白;不寻找,只记得。
随笔 - 24, 文章 - 0, 评论 - 54, 引用 - 0
数据加载中……

成功!用DOM读取XML文件。

    昨天试图用java读取XML文件的内容,但是没成功。原因有几个,当然,最主要的原因是不会啦J。还有一个原因是在我的电脑没有找到相关的资料,不知道怎么做。虽然知道是用DOMSAX,但是依据ppt上的代码做不出来,于是昨天就放弃了。后来想到Groovy号称是java的“加强版”,觉得应该有关于对XML文件操作的方法吧,于是找《Groovy in Action》这本书看了看,嘿,果然有!太让人兴奋了。更让人兴奋的是,它不单单讲怎么用Groovy自己的方法进行XML文件的操作,而且还讲怎么用java的方法操作XML文件(当然代码是用Groovy写的),说是为了更好的比较以显示Groovy的怎么怎么方便J

好了,既然有现成的例子,而且还有讲解,虽然我对Groovy不是很熟,但是也可以看个差不离了(毕竟Groovy的语法很接近java),当然,这其中还少不了要经历一些小小的失败。书上的例子是用DOM,那么我就用DOM了。

我改写的这个程序主要要用到一个变量:plan

它的声明是这样的:Element plan = doc.getDocumentElement();

plan的类型是org.w3c.dom.Element,在jdk的文档里是这样描述的:Element 接口表示 HTML XML 文档中的一个元素。实际上plan的类型也可以用org.w3c.dom.Node代替,在jdk里它是这样描述的: Node接口是整个文档对象模型的主要数据类型。它表示该文档树中的单个节点。Element继承自Node

doc的声明是这样:Dcument doc = builder.parse(new FileInputStream("./src/data/pla.xml"));其类型org.w3c.dom.Documentjdk文档中是这样描述的:Document 接口表示整个 HTML XML 文档。

builder的声明是这样:DocumentBuilder builder = fac.newDocumentBuilder();其类型javax.xml.parsers.DocumentBuilderjdk文档是这样描述的:定义 API 使其从 XML 文档获取 DOM 文档实例。

fac的声明是这样:DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();其类型javax.xml.parsers.DocumentBuilderFactoryjdk文档里是这样描述的:定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。

以上这四个变量是关键,最终得到的plan变量则可靠它的方法进行XML文件的读取。完整是声明是:

DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = fac.newDocumentBuilder();

Document doc = builder.parse(new FileInputStream(

"./src/data/pla.xml"));

Element plan = doc.getDocumentElement();

完整的java代码是:

package test;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.xml.sax.SAXException;

publicclass JXml {

    publicstaticvoid main(String[] args) {

       try {

           DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();

           DocumentBuilder builder = fac.newDocumentBuilder();

           Document doc = builder.parse(new FileInputStream(

                   "./src/data/pla.xml"));

           Element plan = doc.getDocumentElement();

           System.out.println(plan.getNodeName());

//之所以用“1”,而不是“0”是因为在 xml文件里,在weektask之间有一行空白,用“0”//表示的是这行空白

           Node week = plan.getChildNodes().item(1);

           String s = week.getAttributes().getNamedItem("capacity")

                   .getNodeValue();

           System.out.println(s);

           System.out.println(week.getChildNodes().item(1).getAttributes()

                   .getNamedItem("title").getNodeValue());

       } catch (ParserConfigurationException e) {

           e.printStackTrace();

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       } catch (SAXException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

    }

}

pla.xml文件是:

<plan>

<week capacity="8">

<task done="2" total="2" title="read XML chapter"/>

<task done="3" total="3" title="try some reporting"/>

<task done="1" total="2" title="use in current project"/>

</week>

<week capacity="8">

<task done="0" total="1" title="re-read DB chapter"/>

<task done="0" total="3" title="use DB/XML combination"/>

</week>

</plan>

执行结果是:

plan

8

read XML chapter

我看了一下org.w3c.dom.Nodejdk文档,应该可以对XML文件进行操作,明天试试。

除此之外,我又用Groovy写了一遍,书上的例子代码稍稍有些复杂,而且还用到了Groovy特有的东西,不是很明白。虽然不是很明白,但是我改写的Groovy代码比书上的代码简单多了。

下面是我的Groovy代码:

packagetest;

import javax.xml.parsers.DocumentBuilderFactory

import org.w3c.dom.Node

    def fac = DocumentBuilderFactory.newInstance()

    def builder = fac.newDocumentBuilder()

    def doc = builder.parse(new FileInputStream('./src/data/pla.xml'))

    def plan = doc.documentElement

   

    println plan.nodeName

    println plan.childNodes.item(1).attributes.getNamedItem('capacity').nodeValue

    println plan.childNodes.item(1).childNodes.item(1).attributes.getNamedItem('title').nodeValue

同样是实现同一个功能,java用了42行代码,而Groovy只用了12行,简单多了,而且还少了异常处理,看上去舒服多了。

Groovy提供的简便方法是简化了plan变量的声明,代码如下:

packagetest;

import javax.xml.parsers.DocumentBuilderFactory

import org.w3c.dom.Node

    def doc = groovy.xml.DOMBuilder.parse(new FileReader('./src/data/pla.xml'))

    def plan = doc.documentElement

   

    println plan.nodeName

    println plan.childNodes.item(1).attributes.getNamedItem('capacity').nodeValue

println plan.childNodes.item(1).childNodes.item(1).attributes.getNamedItem('title').nodeValue

posted on 2007-09-24 16:54 花开有时 阅读(2185) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航: