竹里館→憶童年

          獨坐幽篁里,彈琴復長嘯;深林人不知,明月來相照
          posts - 9, comments - 23, trackbacks - 0, articles - 0
             :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理

          JDOM解析這樣的XML文件

          Posted on 2007-07-20 17:31 憶童年 閱讀(1466) 評論(2)  編輯  收藏 所屬分類: XML and WebService

          這幾天在開發(fā)中遇到的問題
          XML文檔內(nèi)容

           1<?xml version="1.0" encoding="GB2312"?>
           2<Result xmlns="http://www.fiorano.com/fesb/activity/DBQueryOnInput2/Out">
           3   <query>select * from users where users_id='11111'</query>
           4   <row resultcount="1">
           5      <column name="users_id" type="CHAR">11111     </column>
           6      <column name="users_name" type="CHAR">wangwei   </column>
           7      <column name="users_group" type="CHAR">80        </column>
           8      <column name="users_address" type="CHAR">11111號   </column>
           9   </row>
          10   <row resultcount="1">
          11      <column name="users_id" type="CHAR">11111     </column>
          12      <column name="users_name" type="CHAR">wangwei   </column>
          13      <column name="users_group" type="CHAR">80        </column>
          14      <column name="users_address" type="CHAR">11111號   </column>
          15   </row>
          16</Result>

          本人遇到的問題是在<row></row>下的子元素名稱相同如上第5,6,7,8行.這時當用JDOM通過如下代碼獲取時

          package com.xml;

          import java.io.FileInputStream;
          import java.io.FileNotFoundException;
          import java.io.IOException;
          import java.util.List;

          import org.jdom.Document;
          import org.jdom.Element;
          import org.jdom.JDOMException;
          import org.jdom.Namespace;
          import org.jdom.input.SAXBuilder;

          public class DuXMLTest2 {
              
          public void loadXMLdoc(){
                  FileInputStream fi 
          = null;
                  
          try {
                      fi 
          = new FileInputStream("Test2.xml");
                      SAXBuilder sb 
          = new SAXBuilder();
                      
          try {
                          Document doc 
          = sb.build(fi);
                          Element root 
          = doc.getRootElement();
                          Namespace ns 
          = root.getNamespace();
                          List jiedian 
          = root.getChildren();
                          Element et 
          = (Element) jiedian.get(1);
                          
          //System.out.println(et.getName());
                          List zjiedian = et.getChildren();
                          Element xet 
          = null;
                          String value[] 
          = new String[zjiedian.size()];
                          
          for(int i=0;i<jiedian.size()-1;i++){
                              xet 
          = (Element) jiedian.get(i+1);
                              
          for(int j=0;j<zjiedian.size();j++){
                                  value[j]
          =xet.getChild("column",ns).getText();
                                  System.out.println(value[j]);
                              }

                          }

                      }
           catch (JDOMException e) {
                          
          // TODO 自動生成 catch 塊
                          e.printStackTrace();
                      }
           catch (IOException e) {
                          
          // TODO 自動生成 catch 塊
                          e.printStackTrace();
                      }

                  }
           catch (FileNotFoundException e) {
                      
          // TODO 自動生成 catch 塊
                      e.printStackTrace();
                  }

              }

              
          public static void main(String[] args){
                  DuXMLTest2 dt 
          = new DuXMLTest2();
                  dt.loadXMLdoc();
              }

          }

          通過上面的代碼運行時產(chǎn)生的結(jié)果都只取屬性name="users_id"的元素的值即顯示的內(nèi)容都為11111.看到這結(jié)果當時都快暈了,馬上要吃中午飯搞出這么個問題. 哎先吃飯吧
          誰叫"人是鐵飯是鋼呢".吃飯回來就開始在網(wǎng)上查資料找了半天沒的.看來只有靠自己了,打開JDOM的API文檔一個個方法往過看(E文我哭啊),最后終于找到了

          在Element類下有一個getContent(int index)方法
          public Content getContent(int index)其方法的意思是Returns the child at the given index.
          然后我又打開Content 類在其中找到getValue() 方法
          public abstract java.lang.String getValue()其方法的意思是Returns the XPath 1.0 string value of this child

          看到這我興奮了,不管三七二十一我就燒黃紙砍豬頭想和getContent兄和getValue兄結(jié)為兄弟. 我對你們的崇拜有如滔滔江山....................... 啊!跑題了
          從新更改過的代碼
          package com.xml;

          import java.io.FileInputStream;
          import java.io.FileNotFoundException;
          import java.io.IOException;
          import java.util.List;

          import org.jdom.Document;
          import org.jdom.Element;
          import org.jdom.JDOMException;
          import org.jdom.Namespace;
          import org.jdom.input.SAXBuilder;

          public class DuXMLTest2 {
              
          public void loadXMLdoc(){
                  FileInputStream fi 
          = null;
                  
          try {
                      fi 
          = new FileInputStream("Test2.xml");
                      SAXBuilder sb 
          = new SAXBuilder();
                      
          try {
                          Document doc 
          = sb.build(fi);
                          Element root 
          = doc.getRootElement();
                          Namespace ns 
          = root.getNamespace();
                          List jiedian 
          = root.getChildren();
                          Element et 
          = (Element) jiedian.get(1);
                          
          //System.out.println(et.getName());
                          List zjiedian = et.getChildren();
                          
          int x = zjiedian.size();
                          
          //System.out.println(x);
                          String value[] = new String[x];
                          Element xet 
          = null;
                          
          for(int i=0;i<jiedian.size()-1;i++){
                              xet 
          = (Element) jiedian.get(i+1);
                              
          //System.out.println(xet.getName());
                              for(int j=0;j<zjiedian.size();j++){
                                  value[j]
          =xet.getContent(j).getValue();
                                  System.out.print(value[j]);
                              }

                          }

                      }
           catch (JDOMException e) {
                          
          // TODO 自動生成 catch 塊
                          e.printStackTrace();
                      }
           catch (IOException e) {
                          
          // TODO 自動生成 catch 塊
                          e.printStackTrace();
                      }

                  }
           catch (FileNotFoundException e) {
                      
          // TODO 自動生成 catch 塊
                      e.printStackTrace();
                  }

              }

              
          public static void main(String[] args){
                  DuXMLTest2 dt 
          = new DuXMLTest2();
                  dt.loadXMLdoc();
              }

          }


          評論

          # re: JDOM解析這樣的XML文件  回復  更多評論   

          2007-08-07 21:52 by linjx2000
          文章寫太復雜了, jdom本來不需要那么復雜, 是你自己把他搞復雜了!
          for(int i=0;i<jiedian.size()-1;i++){
          xet = (Element) jiedian.get(i+1);
          //System.out.println(xet.getName());
          for(int j=0;j<zjiedian.size();j++){
          value[j]=xet.getContent(j).getValue();
          System.out.print(value[j]);
          }
          }

          這段代碼, 換成
          for (int i = 0; i < jd2.size(); i++) {
          xet = (Element) jd2.get(i);
          value[i] =xet.getText();
          }
          就可以獲得需要的四個column屬性值了,你寫的還會有問題!

          交流請加入群: 37998636

          # re: JDOM解析這樣的XML文件  回復  更多評論   

          2007-08-07 21:59 by linjx2000
          不好意思,

          換成的代碼里面,jd2----按你代碼的樣子應該改成--->zjiedian


          交流請加入群: 37998636(JavaStudy)


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 景宁| 桂阳县| 济阳县| 香格里拉县| 左云县| 盘山县| 全州县| 石林| 龙泉市| 宕昌县| 巧家县| 泸溪县| 瑞金市| 鹤壁市| 苗栗县| 汝南县| 莒南县| 临泽县| 九龙县| 北安市| 澄城县| 莆田市| 庄河市| 辉县市| 天等县| 太仆寺旗| 双牌县| 蒲江县| 盘山县| 大丰市| 青岛市| 洪江市| 尼玛县| 昆明市| 城固县| 三台县| 宁波市| 鸡东县| 玛曲县| 大竹县| 天门市|