如果我們有一個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