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

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

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

    春風(fēng)博客

    春天里,百花香...

    導(dǎo)航

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

    統(tǒng)計(jì)

    公告

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

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    用分治法解決級(jí)聯(lián)對(duì)象與相應(yīng)XML之間的互相轉(zhuǎn)化問題

    如果我們有一個(gè)group對(duì)象,它底下有一堆company對(duì)象,company底下有一堆employee對(duì)象,我們可稱這三個(gè)對(duì)象為級(jí)聯(lián)對(duì)象,如果要求將對(duì)象從以下
    XML文件中轉(zhuǎn)化過來該怎么做呢?
    <?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)建對(duì)象的代碼將混雜在在一塊,級(jí)聯(lián)關(guān)系越深,代碼將越冗長(zhǎng)難懂而難以修改,使代碼可維護(hù)性不佳;

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

    下面是代碼,請(qǐng)注意觀察下面Group,Company,Employee三個(gè)類的構(gòu)造函數(shù):

    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;
        }

    }

    從上面三個(gè)構(gòu)造函數(shù)我們可以發(fā)現(xiàn),傳入一個(gè)節(jié)點(diǎn),程序會(huì)解析這個(gè)節(jié)點(diǎn)并生成一個(gè)對(duì)象.

    從對(duì)象生成XML是構(gòu)造函數(shù)的逆過程,思想是一樣的,這里就不贅述了,大家觀察三個(gè)類中的makeElement函數(shù)即可.

    調(diào)用過程:
    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得到對(duì)象
                SAXReader reader = new SAXReader();
                Document document
    = reader.read(new File("group1.xml"));
                Element groupElm
    =document.getRootElement().element("group");
                Group group
    =new Group(groupElm);
                
                
    // 從對(duì)象得到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();
            }

        }

    }

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

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

    評(píng)論

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

    不錯(cuò),學(xué)習(xí)了
    不過,JDK里面不是有操作XML的包嗎,為什么要用一個(gè)非標(biāo)準(zhǔn)的包呢  回復(fù)  更多評(píng)論   

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

    @千里冰封

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



      回復(fù)  更多評(píng)論   

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

    XStream可以實(shí)現(xiàn)你想要的 ,應(yīng)該比Dom4j更好  回復(fù)  更多評(píng)論   

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

    @驚鴻逝水

    謝謝指教.  回復(fù)  更多評(píng)論   

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 中文字幕在线免费视频| 亚洲国产精品VA在线观看麻豆| 四虎在线视频免费观看| 最新仑乱免费视频| 午夜小视频免费观看| 亚洲国产精彩中文乱码AV| 亚洲AV无码乱码国产麻豆穿越| 久久久久久免费视频| 午夜私人影院免费体验区| 国产午夜无码视频免费网站| 四虎永久免费观看| 亚洲国产黄在线观看| 亚洲精品国精品久久99热一| 久久精品国产亚洲AV高清热| 久久夜色精品国产噜噜亚洲a| 亚洲色成人WWW永久在线观看| 牛牛在线精品免费视频观看| 久久WWW免费人成—看片| 色屁屁在线观看视频免费| 国产在线精品观看免费观看| 99re热精品视频国产免费| 黄网址在线永久免费观看| 久久精品亚洲男人的天堂| 亚洲视频国产视频| 日韩亚洲Av人人夜夜澡人人爽| 亚洲精品午夜国产va久久| 四虎影视久久久免费| 免费视频爱爱太爽了| 精品国产香蕉伊思人在线在线亚洲一区二区| 久久夜色精品国产噜噜亚洲AV| 亚洲小视频在线播放| 天堂亚洲免费视频| 无人影院手机版在线观看免费| 亚洲中文字幕成人在线| 久久精品国产亚洲av麻豆图片| v片免费在线观看| 成人免费午夜在线观看| 亚洲国产精品国自产拍AV| 日本一区二区在线免费观看| 亚洲欧洲免费无码| 91亚洲自偷手机在线观看|