DOM4j解析xml文件(SaxReader方法),并抽象实体类

<?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

 

 

 

 


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值