<?xml version="1.0" encoding="gbk"?>
<root>
<pnode>
<province>
<pid>10056</pid>
<pname>山东</pname>
<cnode>
<city>
<cid>11017</cid>
<cname>潍坊</cname>
<znode>
<zone>
<zid>11018</zid>
<zname>农垦</zname>
<nnode>
<node>
<nid>11019</nid>
<nname>试验点</nname>
</node>
<node>
<nid>10020</nid>
<nname>测试</nname>
</node>
</nnode>
<zid>11018</zid>
<zname>农垦a </zname>
<nnode>
<node>
<nid>1101a 9</nid>
<nname>试验点a </nname>
</node>
<node>
<nid>1102a 0</nid>
<nname>测试a </nname>
</node>
</nnode>
</zone>
</znode>
</city>
<city>
<cid>11028</cid>
<cname>诸城</cname>
<znode>
<zone>
<zid>11029</zid>
<zname>诸城都是烟田</zname>
<nnode>
<node>
<nid>11030</nid>
<nname>不信你去看</nname>
</node>
<node>
<nid>11041</nid>
<nname>你去看啊</nname>
</node>
</nnode>
</zone>
</znode>
</city>
<city>
<cid>13028</cid>
<cname>济南</cname>
<znode>
<zone>
<zid>13029</zid>
<zname>这是济南的天下</zname>
<nnode>
<node>
<nid>13030</nid>
<nname>济南老下雨</nname>
</node>
<node>
<nid>13041</nid>
<nname>济南真热</nname>
</node>
</nnode>
</zone>
</znode>
</city>
</cnode>
</province>
</pnode>
</root>
例:如上是要进行解析的xml文档
1.首先将信息按照省抽象出Province对象
package entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 杜文俊
* 省类
*/
class UserNode {
private String provinceId;
private String provinceName;
// key=proviceId value=[cityid,cityname]
private List<String[]> cities;
// key=proviceId_cityId value=[disId,disName]
private Map<String, List<String[]>> disMap;
// key=proviceId_cityId_disId value=[nodeId,nodeName]
private Map<String, List<String[]>> nodeMap;
public String getProvinceId() {
return provinceId;
}
public void setProvinceId(String provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
public List<String[]> getCities() {
if (cities == null) {
return new ArrayList<String[]>();
}
return cities;
}
public void setCities(List<String[]> cities) {
this.cities = cities;
}
public Map<String, List<String[]>> getDisMap() {
if (disMap == null) {
return new HashMap<String, List<String[]>>();
}
return disMap;
}
public void setDisMap(Map<String, List<String[]>> disMap) {
this.disMap = disMap;
}
public Map<String, List<String[]>> getNodeMap() {
if (nodeMap == null) {
return new HashMap<String, List<String[]>>();
}
return nodeMap;
}
public void setNodeMap(Map<String, List<String[]>> nodeMap) {
this.nodeMap = nodeMap;
}
}
2.处理公共类
package entity;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class UserNodeInfo implements Serializable {
/**
* @param allFileName xml文件的全路径
* @return List<ProvinceInfo> 以省为单位的数据集合
* @throws DocumentException
* 把xml文件解析出来存储于集合中
*/
public static List<UserNode> readXmlByDom4j(String allFileName)
throws DocumentException {
File file = new File(allFileName);
if (!file.exists()) {
return null;
}
List<UserNode> provinceList = new ArrayList<UserNode>();
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(file);
Element root = document.getRootElement();
List<Node> nodes = root.selectNodes("/root/pnode/province");
Iterator iter = nodes.iterator();
while (iter.hasNext()) {
UserNode provinceInfo = new UserNode();
Map<String, List<String[]>> disMap = new HashMap<String, List<String[]>>();
Map<String, List<String[]>> nodeMap = new HashMap<String, List<String[]>>();
Element proviceElement = (Element) iter.next();
String provinceId = proviceElement.elementText("pid");
String provinceName = proviceElement.elementText("pname");
provinceInfo.setProvinceId(provinceId);
provinceInfo.setProvinceName(provinceName);
List<String[]> cityList = new ArrayList<String[]>();
List<Node> cityNodes = proviceElement.selectNodes("cnode/city");
Iterator cityIter = cityNodes.iterator();
while (cityIter.hasNext()) {
String[] cityInfo = new String[2];
Element cityElement = (Element) cityIter.next();
String cityId = cityElement.elementText("cid");
String cityName = cityElement.elementText("cname");
cityInfo[0] = cityId;
cityInfo[1] = cityName;
List<String[]> disList = new ArrayList<String[]>();
String disKey = provinceId + "_" + cityId;
List<Node> disNodes = cityElement.selectNodes("znode/zone");
Iterator disIter = disNodes.iterator();
while (disIter.hasNext()) {
String[] disInfo = new String[2];
Element disElement = (Element) disIter.next();
String disNodeId = disElement.elementText("zid");
String disNodeName = disElement.elementText("zname");
disInfo[0] = disNodeId;
disInfo[1] = disNodeName;
List<String[]> nodeList = new ArrayList<String[]>();
String nodeKey = provinceId + "_" + cityId + "_"
+ disNodeId;
List<Node> nodeNodes = disElement.selectNodes("nnode/node");
Iterator nodeIter = nodeNodes.iterator();
while (nodeIter.hasNext()) {
String[] nodeInfo = new String[2];
Element nodeElement = (Element) nodeIter.next();
String nodeNodeId = nodeElement.elementText("nid");
String nodeNodeName = nodeElement.elementText("nname");
nodeInfo[0] = nodeNodeId;
nodeInfo[1] = nodeNodeName;
nodeList.add(nodeInfo);
}
nodeMap.put(nodeKey, nodeList);
disList.add(disInfo);
}
disMap.put(disKey, disList);
cityList.add(cityInfo);
}
provinceInfo.setCities(cityList);
provinceInfo.setDisMap(disMap);
provinceInfo.setNodeMap(nodeMap);
provinceList.add(provinceInfo);
}
return provinceList;
}
/**
* @param provinceId 省ID
* @param cityId 市ID
* @param disMap 区集合
* @param nodeMap 子节点集合
* @return String 按照需求排列后的字符串将区信息按照需求列印出来
*/
public static String findDisFromCity(String provinceId, String cityId,
Map<String, List<String[]>> disMap,
Map<String, List<String[]>> nodeMap) {
StringBuffer buffer = new StringBuffer();
if (disMap == null || disMap.size() == 0) {
return "";
} else {
String key = provinceId + "_" + cityId;
List<String[]> districts = disMap.get(key);
for (int i = 0; i < districts.size(); i++) {
String[] district = districts.get(i);
buffer.append("--------区域" + (i + 1) + "_id:" + district[0]
+ "\n" + "--------区域" + (i + 1) + "_name:"
+ district[1] + "\n");
buffer.append(findNodeFromDis(provinceId, cityId, district[0],
nodeMap));
}
}
return buffer.toString();
}
/**
* @param provinceId 省ID
* @param cityId 市ID
* @param disId 区ID
* @param nodeMap 子节点集合
* @return String 按照需求排列 将子节点信息按照需求列印
*/
public static String findNodeFromDis(String provinceId, String cityId,
String disId, Map<String, List<String[]>> nodeMap) {
StringBuffer buffer = new StringBuffer();
if (nodeMap == null || nodeMap.size() == 0) {
return "";
} else {
String key = provinceId + "_" + cityId + "_" + disId;
List<String[]> nodes = nodeMap.get(key);
for (int i = 0; i < nodes.size(); i++) {
String[] node = nodes.get(i);
buffer.append("------------子节点" + (i + 1) + "_id:" + node[0]
+ "\n" + "------------子节点" + (i + 1) + "_name:"
+ node[1] + "\n");
}
}
return buffer.toString();
}
/**
* @param provinces 省信息集合
* 将省信息集合列印出来
*/
public static void printProvice(List<UserNode> provinces) {
StringBuffer buffer = new StringBuffer();
if (provinces == null || provinces.size() == 0) {
System.out.println("没有数据");
return;
} else {
for (int i = 0; i < provinces.size(); i++) {
UserNode provinceInfo = provinces.get(i);
buffer.append("省" + (i + 1) + "_id:"+ provinceInfo.getProvinceId() + "\n" + "省" + (i + 1)+ "_name:" + provinceInfo.getProvinceName() + "\n");
List<String[]> cities = provinceInfo.getCities();
for (int j = 0; j < cities.size(); j++) {
String[] city = cities.get(j);
buffer.append("----城市" + (j + 1) + "_id:" + city[0] + "\n"+ "----城市" + (j + 1) + "_name:" + city[1] + "\n");
buffer.append(findDisFromCity(provinceInfo.getProvinceId(),city[0], provinceInfo.getDisMap(),provinceInfo.getNodeMap()));
}
}
}
System.out.println(buffer.toString());
}
/**
* @param args
* 主函数
*/
public static void main(String[] args) {
try {
// 读取数据
List<UserNode> list = readXmlByDom4j("E:\\test.xml");
// 列印
printProvice(list);
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
记得导入 Dom4j.jar 和 jaxen.jar