<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風博客

    春天里,百花香...

    導航

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

    統計

    公告

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

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

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

    如果我們有一個group對象,它底下有一堆company對象,company底下有一堆employee對象,我們可稱這三個對象為級聯對象,如果要求將對象從以下
    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的代碼和創建對象的代碼將混雜在在一塊,級聯關系越深,代碼將越冗長難懂而難以修改,使代碼可維護性不佳;

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

    下面是代碼,請注意觀察下面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;
        }

    }

    從上面三個構造函數我們可以發現,傳入一個節點,程序會解析這個節點并生成一個對象.

    從對象生成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.tkk7.com/Files/sitinspring/ObjectXml20070917002818.rar

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

    評論

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

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

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

    @千里冰封

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



      回復  更多評論   

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

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

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

    @驚鴻逝水

    謝謝指教.  回復  更多評論   

    sitinspring(http://www.tkk7.com)原創,轉載請注明出處.
    主站蜘蛛池模板: 亚洲产国偷V产偷V自拍色戒| 亚洲欧美日韩中文无线码| 99久久久精品免费观看国产| 亚洲精品久久久久无码AV片软件| 亚洲精品国产福利一二区| 99在线观看免费视频| 亚洲av色香蕉一区二区三区蜜桃| 亚洲另类激情综合偷自拍图| 一个人在线观看视频免费| 一级毛片大全免费播放| 亚洲另类精品xxxx人妖| 亚洲日韩人妻第一页| 999国内精品永久免费视频| 成年网在线观看免费观看网址| 亚洲专区先锋影音| 四虎影视免费永久在线观看| 久9热免费精品视频在线观看| 亚洲第一街区偷拍街拍| 久久久久亚洲AV片无码下载蜜桃| 国产日产成人免费视频在线观看| 免费福利在线视频| 免费视频成人国产精品网站| 亚洲免费黄色网址| 亚洲国产精品无码久久久不卡| 国产精品久久免费视频| 国产91免费在线观看| 成人国产精品免费视频| 最新亚洲人成无码网www电影| 亚洲美女视频免费| 亚洲色无码一区二区三区| 日本大片在线看黄a∨免费| 最近免费mv在线电影| 在线看片免费人成视频久网下载| 亚洲av成本人无码网站| 国产 亚洲 中文在线 字幕| 特级毛片全部免费播放a一级| 亚洲人成网www| 亚洲日韩精品无码一区二区三区 | 久久99精品国产免费观看| 国产精品亚洲天堂| 亚洲精品无码久久久久YW|