花開(kāi)有時(shí)

          花開(kāi)有時(shí),花落有時(shí),來(lái)有時(shí),去有時(shí)。不撕扯,只關(guān)切;不紀(jì)念,只牽掛;不感動(dòng),只明白;不尋找,只記得。
          隨筆 - 24, 文章 - 0, 評(píng)論 - 54, 引用 - 0
          數(shù)據(jù)加載中……

          成功!用DOM讀取XML文件。

              昨天試圖用java讀取XML文件的內(nèi)容,但是沒(méi)成功。原因有幾個(gè),當(dāng)然,最主要的原因是不會(huì)啦J。還有一個(gè)原因是在我的電腦沒(méi)有找到相關(guān)的資料,不知道怎么做。雖然知道是用DOMSAX,但是依據(jù)ppt上的代碼做不出來(lái),于是昨天就放棄了。后來(lái)想到Groovy號(hào)稱(chēng)是java的“加強(qiáng)版”,覺(jué)得應(yīng)該有關(guān)于對(duì)XML文件操作的方法吧,于是找《Groovy in Action》這本書(shū)看了看,嘿,果然有!太讓人興奮了。更讓人興奮的是,它不單單講怎么用Groovy自己的方法進(jìn)行XML文件的操作,而且還講怎么用java的方法操作XML文件(當(dāng)然代碼是用Groovy寫(xiě)的),說(shuō)是為了更好的比較以顯示Groovy的怎么怎么方便J

          好了,既然有現(xiàn)成的例子,而且還有講解,雖然我對(duì)Groovy不是很熟,但是也可以看個(gè)差不離了(畢竟Groovy的語(yǔ)法很接近java),當(dāng)然,這其中還少不了要經(jīng)歷一些小小的失敗。書(shū)上的例子是用DOM,那么我就用DOM了。

          我改寫(xiě)的這個(gè)程序主要要用到一個(gè)變量:plan

          它的聲明是這樣的:Element plan = doc.getDocumentElement();

          plan的類(lèi)型是org.w3c.dom.Element,在jdk的文檔里是這樣描述的:Element 接口表示 HTML XML 文檔中的一個(gè)元素。實(shí)際上plan的類(lèi)型也可以用org.w3c.dom.Node代替,在jdk里它是這樣描述的: Node接口是整個(gè)文檔對(duì)象模型的主要數(shù)據(jù)類(lèi)型。它表示該文檔樹(shù)中的單個(gè)節(jié)點(diǎn)。Element繼承自Node

          doc的聲明是這樣:Dcument doc = builder.parse(new FileInputStream("./src/data/pla.xml"));其類(lèi)型org.w3c.dom.Documentjdk文檔中是這樣描述的:Document 接口表示整個(gè) HTML XML 文檔。

          builder的聲明是這樣:DocumentBuilder builder = fac.newDocumentBuilder();其類(lèi)型javax.xml.parsers.DocumentBuilderjdk文檔是這樣描述的:定義 API 使其從 XML 文檔獲取 DOM 文檔實(shí)例。

          fac的聲明是這樣:DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();其類(lèi)型javax.xml.parsers.DocumentBuilderFactoryjdk文檔里是這樣描述的:定義工廠 API,使應(yīng)用程序能夠從 XML 文檔獲取生成 DOM 對(duì)象樹(shù)的解析器。

          以上這四個(gè)變量是關(guān)鍵,最終得到的plan變量則可靠它的方法進(jìn)行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”是因?yàn)樵?/span> 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>

          執(zhí)行結(jié)果是:

          plan

          8

          read XML chapter

          我看了一下org.w3c.dom.Nodejdk文檔,應(yīng)該可以對(duì)XML文件進(jìn)行操作,明天試試。

          除此之外,我又用Groovy寫(xiě)了一遍,書(shū)上的例子代碼稍稍有些復(fù)雜,而且還用到了Groovy特有的東西,不是很明白。雖然不是很明白,但是我改寫(xiě)的Groovy代碼比書(shū)上的代碼簡(jiǎn)單多了。

          下面是我的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

          同樣是實(shí)現(xiàn)同一個(gè)功能,java用了42行代碼,而Groovy只用了12行,簡(jiǎn)單多了,而且還少了異常處理,看上去舒服多了。

          Groovy提供的簡(jiǎn)便方法是簡(jiǎn)化了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 花開(kāi)有時(shí) 閱讀(2198) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java

          主站蜘蛛池模板: 遂昌县| 大悟县| 奉化市| 镇赉县| 丰宁| 吉木萨尔县| 白水县| 南川市| 阳原县| 孙吴县| 康乐县| 广南县| 宜昌市| 山阴县| 尖扎县| 红安县| 正宁县| 罗定市| 高雄市| 子长县| 利津县| 通州区| 沁阳市| 玛沁县| 望都县| 邵武市| 长汀县| 新邵县| 洪江市| 乐业县| 潼关县| 洛浦县| 临沧市| 绥德县| 洪雅县| 宜君县| 无棣县| 黄石市| 灵丘县| 西吉县| 湘潭县|