博學(xué)而篤志,好問而近思

          關(guān)于Java中的XML讀寫應(yīng)用

          XML 應(yīng)用中,最常用也最實(shí)用的莫過于 XML 文件的讀寫,這里通過一個(gè)簡(jiǎn)單的 XML 文件讀寫來作簡(jiǎn)要分析。可以在任何文本編輯器中先建立如下結(jié)構(gòu)的 XML 文件,類似于 HTML 結(jié)構(gòu),但 XML 語義比較嚴(yán)格,起始標(biāo)記必須配對(duì),比如 " 〈學(xué)生花名冊(cè)〉 " " 〈/學(xué)生花名冊(cè)〉 " 對(duì)應(yīng),空格多少可不必在意,但一般都以縮格形式書寫,便于閱讀。把此文件命名為 Input.xml ,可以在任何支持 XML 的瀏覽器中打開測(cè)試一下,如果輸入正確,在瀏覽中可以看到此文件的樹形表示結(jié)構(gòu)。

          ?xml   version="1.0"   encoding="GB2312"? > 
          <學(xué)生花名冊(cè)> 
           <學(xué)生 性別  =   " " > 
            <姓名>李華< / 姓名>  
            <年齡> 14 / 年齡> 
            <電話> 6287555 / 電話> 
           < / 學(xué)生> 
           <學(xué)生 性別  =   " " > 
            <姓名>張三< / 姓名> 
            <年齡> 16 / 年齡> 
            <電話> 8273425 / 電話> 
           < / 學(xué)生> 
          / 學(xué)生花名冊(cè)>
           
            準(zhǔn)備工作做完后,接著就開始寫實(shí)質(zhì)性的 JAVA 代碼了。為保存從 XML 文件讀入的信息,需要先建一個(gè)簡(jiǎn)單的 Bean 來保存學(xué)生信息,命名為 StudentBean ,代碼如下所示: 

          public
            class   StudentBean   {  
            private   String   sex;   // 學(xué)生性別 
            private   String   name;   // 學(xué)生姓名 
            private   int   age;   // 學(xué)生年齡 
            private   String   phone;   // 電話號(hào)碼 

            public   void   setSex(String   s)   {  
             sex   =   s;  
            }  
            public   void   setName(String   s)   {  
             name   =   s;  
            }  
            public   void   setAge(int   a)   {  
             age   =   a;  
            }  
            public   void   setPhone(String   s)   {  
             phone   =   s;  
            }  
            public   String   getSex()   {  
             return   sex;  
            }  
            public   String   getName()   {  
             return   name;  
            }  
            public   int   getAge()   {  
             return   age;  
            }   
            public   String   getPhone()   {  
             return   phone;  
            }  
          }
           

            之后寫 XML 的測(cè)試類,筆者把這個(gè)類命名為 XMLTest ,為了讀寫 XML 文件,需要導(dǎo)入如下 JAVA 包, "http://" 后為注釋說明,筆者的環(huán)境是 JDK   1.3.1 _04 ,在 JDK   1.4.0 中測(cè)試也通過, XML 解釋器用 Apache Crimson ,可以到 Apache 主頁去上載。 

          import
            java.io.*;   //Java 基礎(chǔ)包,包含各種 IO 操作 
          import
            java.util.*;   //Java 基礎(chǔ)包,包含各種標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu)操作 
          import
            javax.xml.parsers.*;   //XML 解析器接口 
          import
            org.w3c.dom.*;   //XML DOM 實(shí)現(xiàn) 
          import
            org.apache.crimson.tree.XmlDocument;// XML 文件要用到 

            為了保存多個(gè)學(xué)生信息,還得借助一個(gè)集合類 ( 并不是單純意義上的集合, JAVA 中的集合是集合框架的概念,包含向量、列表、哈希表等),這里采用 Vector 向量類。定義在 XMLTest 測(cè)試類中,命名為 student_Vector 。然后定義兩個(gè)方法 readXMLFile writeXMLFile ,實(shí)現(xiàn)讀寫操作。代碼如下: 

          private
            void   readXMLFile(String   inFile)   throws   Exception   {  
            // 為解析 XML 作準(zhǔn)備,創(chuàng)建 DocumentBuilderFactory 實(shí)例 , 指定 DocumentBuilder  
            DocumentBuilderFactory   dbf   =   DocumentBuilderFactory.newInstance();  
            DocumentBuilder   db   =   null;  
            try   {  
             db   =   dbf.newDocumentBuilder();  
            }catch   (ParserConfigurationException   pce)   {  
             System.err.println(pce);   // 出異常時(shí)輸出異常信息,然后退出,下同 
             System.exit(1);  
            }  

            Document   doc   =   null;  
            try   {  
             doc   =   db.parse(inFile);  
            }   catch   (DOMException   dom)   {  
             System.err.println(dom.getMessage());  
             System.exit(1);  
            }   catch   (IOException   ioe)   {  
             System.err.println(ioe);  
             System.exit(1);  
            }  
            // 下面是解析 XML 的全過程,比較簡(jiǎn)單,先取根元素 " 學(xué)生花名冊(cè) "  
            Element   root   =   doc.getDocumentElement();  
            // " 學(xué)生 " 元素列表 
            NodeList   students   =   root.getElementsByTagName(" 學(xué)生 ");  
            for   (int   i   =   0;   i  <  students.getLength();   i++)   {  
             // 依次取每個(gè) " 學(xué)生 " 元素 
             Element   student   =   (Element)   students.item(i);  
             // 創(chuàng)建一個(gè)學(xué)生的 Bean 實(shí)例 
             StudentBean   studentBean   =   new   StudentBean();  
             // 取學(xué)生的性別屬性 
             studentBean.setSex(student.getAttribute(" 性別 "));  
             // " 姓名 " 元素,下面類同 
             NodeList   names   =   student.getElementsByTagName(" 姓名 ");  
             if   (names.getLength()   ==   1)   {  
              Element   e   =   (Element)   names.item(0);  
              Text   t   =   (Text)   e.getFirstChild();  
              studentBean.setName(t.getNodeValue());  
             }  

             NodeList   ages   =   student.getElementsByTagName(" 年齡 ");  
             if   (ages.getLength()   ==   1)   {  
              Element   e   =   (Element)   ages.item(0);  
              Text   t   =   (Text)   e.getFirstChild();  
              studentBean.setAge(Integer.parseInt(t.getNodeValue()));  
             }  

             NodeList   phones   =   student.getElementsByTagName(" 電話 ");  
             if   (phones.getLength()   ==   1)   {  
              Element   e   =   (Element)   phones.item(0);  
              Text   t   =   (Text)   e.getFirstChild();  
              studentBean.setPhone(t.getNodeValue());  
             }  

             student_Vector.add(studentBean);  
            }  
          }
           

          private
            void   writeXMLFile(String   outFile)   throws   Exception   {  
            // 為解析 XML 作準(zhǔn)備,創(chuàng)建 DocumentBuilderFactory 實(shí)例 , 指定 DocumentBuilder  
            DocumentBuilderFactory   dbf   =   DocumentBuilderFactory.newInstance();  
            DocumentBuilder   db   =   null;  
            try   {  
             db   =   dbf.newDocumentBuilder();  
            }   catch   (ParserConfigurationException   pce)   {  
             System.err.println(pce);  
             System.exit(1);  
            }  

            Document   doc   =   null;  
            doc   =   db.newDocument();  

            // 下面是建立 XML 文檔內(nèi)容的過程,先建立根元素 " 學(xué)生花名冊(cè) "  
            Element   root   =   doc.createElement(" 學(xué)生花名冊(cè) ");  
            // 根元素添加上文檔 
            doc.appendChild(root);  

            // 取學(xué)生信息的 Bean 列表 
            for   (int   i   =   0;   i  <  student_Vector.size();   i++)   {  
             // 依次取每個(gè)學(xué)生的信息 
             StudentBean   studentBean   =   (StudentBean)   student_Vector.get(i);  
             // 建立 " 學(xué)生 " 元素,添加到根元素 
             Element   student   =   doc.createElement(" 學(xué)生 ");  
             student.setAttribute(" 性別 ",   studentBean.getSex());  
             root.appendChild(student);  
             // 建立 " 姓名 " 元素,添加到學(xué)生下面,下同 
             Element   name   =   doc.createElement(" 姓名 ");  
             student.appendChild(name);  
             Text   tName   =   doc.createTextNode(studentBean.getName());  
             name.appendChild(tName);  

             Element   age   =   doc.createElement(" 年齡 ");  
             student.appendChild(age);  
             Text   tAge   =   doc.createTextNode(String.valueOf(studentBean.getAge()));  
             age.appendChild(tAge);  

             Element   phone   =   doc.createElement(" 電話 ");  
             student.appendChild(phone);  
             Text   tPhone   =   doc.createTextNode(studentBean.getPhone());  
              phone.appendChild(tPhone);  
            }  
            // XML 文檔輸出到指定的文件 
            FileOutputStream   outStream   =   new   FileOutputStream(outFile);  
            OutputStreamWriter   outWriter   =   new   OutputStreamWriter(outStream);  
            ((XmlDocument)   doc).write(outWriter,   "GB2312");  
            outWriter.close();  
            outStream.close();   
          }
           

            最后加入測(cè)試主函數(shù),如下: 

          public
            static   void   main(String[]   args)   throws   Exception   {  
            // 建立測(cè)試實(shí)例  
            XMLTest   xmlTest   =   new   XMLTest();  
            // 初始化向量列表 
            xmlTest.student_Vector   =   new   Vector();  
           
            System.out.println(" 開始讀 Input.xml 文件 ");  
            xmlTest.readXMLFile("Input.xml");  
           
            System.out.println(" 讀入完畢 , 開始寫 Output.xml 文件 ");  
            xmlTest.writeXMLFile("Output.xml");  
            System.out.println(" 寫入完成 ");  
          }
           

            好了,保存好 StudentBean XMLTest ,把 Input.xml 保存到工作目錄下。如果您輸入很仔細(xì),沒敲錯(cuò)字母的話,可以看到 " 寫入完成 " 了,去瞧瞧 Output.xml 文件和 Input.xml 文件是不是一樣吧。

          posted on 2006-06-21 14:05 冰川 閱讀(1923) 評(píng)論(1)  編輯  收藏

          評(píng)論

          # re: 關(guān)于Java中的XML讀寫應(yīng)用 2009-10-23 17:04

          很實(shí)用,謝謝  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(14)

          隨筆檔案

          BlogJava的幫助

          朋友的博客

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          快樂工作—享受生活
          主站蜘蛛池模板: 镇巴县| 西畴县| 明水县| 札达县| 商水县| 永年县| 安泽县| 沁阳市| 安龙县| 西充县| 翼城县| 宁化县| 平顶山市| 雷波县| 永新县| 孟津县| 张家港市| 蚌埠市| 固原市| 大足县| 自治县| 乐山市| 长海县| 郎溪县| 灯塔市| 洪江市| 石嘴山市| 砚山县| 牡丹江市| 越西县| 浮山县| 宣城市| 德保县| 开阳县| 清水县| 漾濞| 和田市| 孟村| 新绛县| 土默特左旗| 南昌市|