春風博客

          春天里,百花香...

          導航

          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          統(tǒng)計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          用分治法解決級聯(lián)對象與相應XML之間的互相轉化問題

          如果我們有一個group對象,它底下有一堆company對象,company底下有一堆employee對象,我們可稱這三個對象為級聯(lián)對象,如果要求將對象從以下
          XML文件中轉化過來該怎么做呢?
          <?xml version="1.0" encoding="UTF-8"?>
          <root>
              
          <group name="citigroup">
                  
          <location>New york</location>
                  
          <company name="citibank">
                      
          <location>Paris</location>
                      
          <employee name="andy">
                          
          <age>29</age>
                      
          </employee>
                      
          <employee name="bill">
                          
          <age>30</age>
                      
          </employee>
                      
          <employee name="cindy">
                          
          <age>31</age>
                      
          </employee>
                  
          </company>
                  
          <company name="citisoft">
                      
          <location>Dalian</location>
                      
          <employee name="doll">
                          
          <age>32</age>
                      
          </employee>
                      
          <employee name="edin">
                          
          <age>33</age>
                      
          </employee>
                      
          <employee name="felix">
                          
          <age>34</age>
                      
          </employee>
                  
          </company>
              
          </group>
          </root>

          如果集中解析XML的話,解析XML的代碼和創(chuàng)建對象的代碼將混雜在在一塊,級聯(lián)關系越深,代碼將越冗長難懂而難以修改,使代碼可維護性不佳;

          如果我們讓一個對象與相應的XML節(jié)點關聯(lián)起來的話,只需要在構造函數中處理有關部分的XML.拿Group對象舉例來說,它只需要知道如何從一個<group>...</group>節(jié)點中提取name,location以及下級的company就行了,從XML的角度來說,它只需要辨認<group>節(jié)點下的<name>屬性,<location>子節(jié)點和<company>子節(jié)點就行了,轉化為對象時只需轉化這些內容,而下級節(jié)點如<company>的內容則交給Company類去處理.對一個類來說,它只需要知道和成員變量有關的節(jié)點就行了,其它部分自有上級或下級類處理,這樣一層層分治開來,代碼結構將清晰和簡化起來.

          下面是代碼,請注意觀察下面Group,Company,Employee三個類的構造函數:

          Group類:
          package com.sitinspring.objectxml;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.List;

          import org.dom4j.Element;

          public class Group {
              
          private String name;

              
          private String location;

              
          private List<Company> companies;

              
          public Group(Element element){
                  
          this.name=element.attributeValue("name");
                  
          this.location=element.elementText("location");
                  
                  companies
          =new ArrayList<Company>();
                  List companyNodes 
          = element.elements("company");        
                  
          for (Iterator it = companyNodes.iterator(); it.hasNext();) {
                      Element companyElm 
          = (Element) it.next();
                      companies.add(
          new Company(companyElm));
                  }

              }

              
              
          public Element makeElement(Element parentElm){
                  Element element
          =parentElm.addElement("group");
                  
                  element.addAttribute(
          "name"this.name);
                  Element ageElm 
          = element.addElement("location");
                  ageElm.setText(
          this.location);
                  
                  
          for (Iterator it = companies.iterator(); it.hasNext();) {
                      Company company 
          = (Company) it.next();
                      
                      company.makeElement(element);
                  }

                  
                  
          return element;
              }

              
              
          public List<Company> getCompanies() {
                  
          return companies;
              }


              
          public String getLocation() {
                  
          return location;
              }


              
          public void setLocation(String location) {
                  
          this.location = location;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }

          }

          Company類:
          package com.sitinspring.objectxml;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.List;

          import org.dom4j.Element;

          public class Company {
              
          private String name;

              
          private String location;

              
          private List<Employee> employees;

              
          public Company(Element element){
                  
          this.name=element.attributeValue("name");
                  
          this.location=element.elementText("location");
                  
                  employees
          =new ArrayList<Employee>();
                  List employeeNodes 
          = element.elements("employee");        
                  
          for (Iterator it = employeeNodes.iterator(); it.hasNext();) {
                      Element employeeElm 
          = (Element) it.next();
                      employees.add(
          new Employee(employeeElm));
                  }

              }

              
              
          public Element makeElement(Element parentElm){
                  Element element
          =parentElm.addElement("company");
                  
                  element.addAttribute(
          "name"this.name);
                  Element ageElm 
          = element.addElement("location");
                  ageElm.setText(
          this.location);
                  
                  
          for (Iterator it = employees.iterator(); it.hasNext();) {
                      Employee employee 
          = (Employee) it.next();
                      employee.makeElement(element);
                  }

                  
                  
          return element;
              }

              
              
          public String getLocation() {
                  
          return location;
              }


              
          public void setLocation(String location) {
                  
          this.location = location;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public List<Employee> getEmployees() {
                  
          return employees;
              }


              
          public void setEmployees(List<Employee> employees) {
                  
          this.employees = employees;
              }

          }

          Employee類:
          package com.sitinspring.objectxml;

          import org.dom4j.Element;

          public class Employee {
              
          private String name;

              
          private int age;

              
          public Employee(Element element) {
                  
          this.name = element.attributeValue("name");
                  
          this.age = Integer.parseInt(element.elementText("age"));
              }


              
          public Element makeElement(Element parentElm) {
                  Element element 
          = parentElm.addElement("employee");

                  element.addAttribute(
          "name"this.name);
                  Element ageElm 
          = element.addElement("age");
                  ageElm.setText(String.valueOf(
          this.age));

                  
          return element;
              }


              
          public int getAge() {
                  
          return age;
              }


              
          public void setAge(int age) {
                  
          this.age = age;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }

          }

          從上面三個構造函數我們可以發(fā)現(xiàn),傳入一個節(jié)點,程序會解析這個節(jié)點并生成一個對象.

          從對象生成XML是構造函數的逆過程,思想是一樣的,這里就不贅述了,大家觀察三個類中的makeElement函數即可.

          調用過程:
          package com.sitinspring.objectxml;

          import java.io.File;
          import java.io.FileWriter;

          import org.dom4j.Document;
          import org.dom4j.DocumentHelper;
          import org.dom4j.Element;
          import org.dom4j.io.SAXReader;
          import org.dom4j.io.XMLWriter;

          public class Test{
              
          public static void main(String[] args){
                  
          try{
                      
          // 從XML得到對象
                      SAXReader reader = new SAXReader();
                      Document document
          = reader.read(new File("group1.xml"));
                      Element groupElm
          =document.getRootElement().element("group");
                      Group group
          =new Group(groupElm);
                      
                      
          // 從對象得到XML
                      Document document2 = DocumentHelper.createDocument();
                      Element root 
          = document2.addElement("root");
                      Element groupElm2
          =group.makeElement(root);

                      XMLWriter writer 
          = new XMLWriter(new FileWriter("group2.xml"));
                      writer.write(document2);
                      writer.close();
                  }

                  
          catch(Exception ex){
                      ex.printStackTrace();
                  }

              }

          }

          源碼下載(請大家自行加入dom4j包):
          http://www.aygfsteel.com/Files/sitinspring/ObjectXml20070917002818.rar

          posted on 2007-09-17 00:25 sitinspring 閱讀(1340) 評論(4)  編輯  收藏 所屬分類: Object Orient Programming

          評論

          # re: 用分治法解決級聯(lián)對象與相應XML之間的互相轉化問題 2007-09-17 09:54 千里冰封

          不錯,學習了
          不過,JDK里面不是有操作XML的包嗎,為什么要用一個非標準的包呢  回復  更多評論   

          # re: 用分治法解決級聯(lián)對象與相應XML之間的互相轉化問題 2007-09-17 09:59 sitinspring

          @千里冰封

          以前做項目習慣用dom4j了,再之前用jdom.1.5以前的dom或sax沒他們倆這么方便,1.5以后就不清楚了.你有什么更好的推薦嗎?



            回復  更多評論   

          # re: 用分治法解決級聯(lián)對象與相應XML之間的互相轉化問題 2007-09-17 13:11 驚鴻逝水

          XStream可以實現(xiàn)你想要的 ,應該比Dom4j更好  回復  更多評論   

          # re: 用分治法解決級聯(lián)對象與相應XML之間的互相轉化問題 2007-09-17 13:17 sitinspring

          @驚鴻逝水

          謝謝指教.  回復  更多評論   

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉載請注明出處.
          主站蜘蛛池模板: 龙井市| 托克逊县| 孟村| 仪征市| 浦东新区| 静宁县| 黄梅县| 浠水县| 昌都县| 灵石县| 常山县| 泉州市| 平潭县| 鱼台县| 鄢陵县| 新兴县| 宁明县| 县级市| 临潭县| 南平市| 娱乐| 大渡口区| 石台县| 和林格尔县| 富源县| 得荣县| 万年县| 辉南县| 吴忠市| 勃利县| 边坝县| 赤城县| 宁化县| 大理市| 霍山县| 内黄县| 南雄市| 靖边县| 河西区| 阿合奇县| 陈巴尔虎旗|