`
hhcysn
  • 浏览: 16218 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

DOM方式解析xml文件

    博客分类:
  • xml
阅读更多
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.safetys.customerform.xml.model.Area;

/**
 * 
 * @author hehc
 *
 */
public class AreaUtil {
	
	public static final String FROM_XML = "xml";
	
	private String from = FROM_XML;
	
	private String xmlFileDirectory;
	
	private Map<String,Area> areaMap = new HashMap<String, Area>(); // provinceCode, provinceArea
	
	private AreaUtil(){
		super();
	}
	
	public final static AreaUtil getInstance(String FROM, String xmlFileDirectory){
		AreaUtil areaUtil = new AreaUtil();
		areaUtil.setFrom(FROM);
		areaUtil.setXmlFileDirectory(xmlFileDirectory);
		areaUtil.init();
		return areaUtil;
	}
	
	/**
	 * 解析xml文件
	 ********************************************************
	 * template of xml:                                     *
	 * <area name="国家">					                *
	 *   <first-area name="省" code="">			         *
	 *      <second-area name="市" code="">			     *
	 *          <third-area name="区" code=""></third-area> *
	 *      </second-area>					              *
	 *   </first-area>					                  *
	 * </area>	 				                          *
	 ********************************************************
	 */
	private void init(){
		if(from != null && from.equals(AreaUtil.FROM_XML)){
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			try {
				DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
				if(xmlFileDirectory == null)
					throw new Exception("xml文件地址为空!");
				Document doc = documentBuilder.parse(new FileInputStream(xmlFileDirectory));
				Element areaRoot = doc.getDocumentElement();
				// System.out.println(areaRoot.getAttribute("name"));
				
				NodeList firstAreas = areaRoot.getChildNodes();
				Map<String,Area> firstAreaMap = new HashMap<String, Area>();
				for(int i = 0; i < firstAreas.getLength(); i++){//遍历first-area标签
					Area firstArea = new Area();
					Node firstNode = firstAreas.item(i);
					if(firstNode.getNodeType() == Node.ELEMENT_NODE){
						firstArea.setName(firstNode.getAttributes().
								getNamedItem("name").getNodeValue());
						firstArea.setCode(firstNode.getAttributes().
								getNamedItem("code").getNodeValue());
						
						NodeList secondAreas = firstNode.getChildNodes();
						Map<String,Area> secondAreaMap = new HashMap<String, Area>();
						for(int j = 0; j < secondAreas.getLength(); j++){//遍历second-area标签
							Area secondArea = new Area();
							Node secondNode = secondAreas.item(j);
							if(secondNode.getNodeType() == Node.ELEMENT_NODE){
								secondArea.setName(secondNode.getAttributes().
										getNamedItem("name").getNodeValue());
								secondArea.setCode(secondNode.getAttributes().
										getNamedItem("code").getNodeValue());
								
								NodeList thirdAreas = secondNode.getChildNodes();
								Map<String,Area> thirdAreaMap = new HashMap<String, Area>();
								for(int k = 0; k < thirdAreas.getLength(); k++){//遍历third-area标签
									
									Area thirdArea = new Area();
									Node thirdNode = thirdAreas.item(k);
									if(thirdNode.getNodeType() == Node.ELEMENT_NODE){
										thirdArea.setName(thirdNode.getAttributes().
												getNamedItem("name").getNodeValue());
										thirdArea.setCode(thirdNode.getAttributes().
												getNamedItem("code").getNodeValue());
										
										thirdAreaMap.put(thirdArea.getCode(), thirdArea);
									}
								}
								
								secondArea.setAreaMap(thirdAreaMap);
								
								secondAreaMap.put(secondArea.getCode(), secondArea);
							}
						}
						
						firstArea.setAreaMap(secondAreaMap);
						
						firstAreaMap.put(firstArea.getCode(), firstArea);
					}
					
				}
				areaMap = firstAreaMap;
				
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			} catch (FileNotFoundException e) { 
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		
	    }
	}
	
	/**
	 * 返回当前国家区域的所有下一级(二级)行政单位(中国:省)
	 * @return Map<String provinceCode, String provinceName>
	 */
	public Map<String, String> getProvinces(){
		Map<String, String> map = new HashMap<String, String>();
		if(areaMap != null && !areaMap.isEmpty()){
			Iterator<String> it = areaMap.keySet().iterator();
			while(it.hasNext()){
				String code = it.next();
				map.put(code, areaMap.get(code).getName());
			}
		}
		return map;
	}
	
	/**
	 * 返回当前国家区域、指定二级行政单位下的所有三级行政单位(中国:市)
	 * @param provinceCode
	 * @return Map<String cityCode, String cityName>
	 */
	public Map<String, String> getCities(String provinceCode){
		Map<String, String> map = new HashMap<String, String>();
		if(areaMap != null & !areaMap.isEmpty()){
			Area firstArea = areaMap.get(provinceCode);
			if(firstArea != null){
				Map<String, Area> secondAreaMap = firstArea.getAreaMap();
				if(secondAreaMap != null && !secondAreaMap.isEmpty()){
					Iterator<String> it = secondAreaMap.keySet().iterator();
					while(it.hasNext()){
						String code = it.next();
						map.put(code, secondAreaMap.get(code).getName());
					}
				}
			}
		}
		return map;
	}
	
	/**
	 * 返回当前国家区域、指定二级行政单位下的所有四级行政单位(中国:区)
	 * @param provinceCode
	 * @param cityCode
	 * @return Map<String regionCode, String regionName>
	 */
	public Map<String, String> getRegions(String provinceCode, String cityCode){
		Map<String, String> map = new HashMap<String, String>();
		if(areaMap != null & !areaMap.isEmpty()){
			
			Area firstArea = areaMap.get(provinceCode);
			if(firstArea != null){
				Map<String,Area> secondAreaMap = firstArea.getAreaMap();
				
				if(secondAreaMap != null && !secondAreaMap.isEmpty()){
					Area secondArea = secondAreaMap.get(cityCode);
					
					if(secondArea != null){
						Map<String, Area> thirdAreaMap = secondArea.getAreaMap();
						if(thirdAreaMap != null && !thirdAreaMap.isEmpty()){
							Iterator<String> it = thirdAreaMap.keySet().iterator();
							while(it.hasNext()){
								String code = it.next();
								map.put(code, thirdAreaMap.get(code).getName());
							}
						}
					}
				}
			}
		}
		return map;
	}
	
	/**
	 * 根据当前国家区域、指定某区域代码获取该区域名称
	 * @param areaCode
	 * @return String
	 */
	public String getAreaName(String areaCode) throws Exception{
		
		if(areaMap != null && !areaMap.isEmpty()){
			Iterator<String> it = areaMap.keySet().iterator();
			while(it.hasNext()){
				String firstCode = it.next();
				if(firstCode.equals(areaCode)){
					return areaMap.get(firstCode).getName();
				}
				
				Map<String, Area> secondAreaMap = areaMap.get(firstCode).getAreaMap();
				if(secondAreaMap != null && !secondAreaMap.isEmpty()){
					Iterator<String> it_ = secondAreaMap.keySet().iterator();
					while(it_.hasNext()){
						String secondCode = it_.next();
						if(secondCode.equals(areaCode)){
							return secondAreaMap.get(secondCode).getName();
						}
						
						Map<String, Area> thirdAreaMap = secondAreaMap.get(secondCode).getAreaMap();
						if(thirdAreaMap != null && !thirdAreaMap.isEmpty()){
							Iterator<String> it__ = thirdAreaMap.keySet().iterator();
							while(it__.hasNext()){
								String thirdCode = it__.next();
								if(thirdCode.equals(areaCode)){
									return thirdAreaMap.get(thirdCode).getName();
								}
							}
						}
					}
				}
			}
			throw new Exception("未知区域");
		}
		return null;
	}

	private void setFrom(String from) {
		this.from = from;
	}

	private void setXmlFileDirectory(String xmlFileDirectory) {
		this.xmlFileDirectory = xmlFileDirectory;
	}
分享到:
评论

相关推荐

    DOMParser解析xml

    DOMParser接口提供了解析XML字符串并创建DOM文档的方法,以便于开发者可以使用DOM API来查询、修改或操作XML数据。 以下是对"DOMParser解析XML"这一主题的详细说明: 1. **DOMParser的基本使用**: 使用DOMParser...

    Dom方式解析XML

    - **解析XML文件**:然后,使用`DocumentBuilder`解析XML文件,得到`Document`对象,表示整个XML文档。 ```java File xmlFile = new File("path_to_xml_file"); Document document = builder.parse(xmlFile); `...

    Java解析XML文件的DOM和SAX方式.doc

    Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种方式的原理、实现和优缺点。 DOM 方式 ...

    DOM方式解析XML.pdf

    在QT中,可以使用DOM方式解析XML文档,将XML文档读入内存,构建为DOM树,并通过节点遍历的方式实现数据的存取和操作。 在DOM方式中,XML文档中的每个成分都是一个节点。例如,整个文档对应一个文档节点;每个XML...

    java_dom解析xml xml java

    标题“java_dom解析xml xml java”表明了本文档的主题是关于如何使用Java中的DOM技术来解析XML文件。 #### 描述分析 描述中提到这是一个适合新手入门的内容,并给出了一个简单的XML示例。该XML文档包含了一个`...

    DOM解析XML文件例子

    在这个例子中,我们将深入探讨如何使用DOM解析XML文件,以理解和掌握XML文档的结构,并进行数据提取、修改和创建。 首先,XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据,具有自描述性和...

    android dom方式解析xml

    总的来说,DOM解析方式在Android中适用于小型或中型XML文件,因为它将整个XML加载到内存,可以快速访问任何节点,但不适合处理大型XML文件。对于大型文件,更推荐使用SAX(Simple API for XML)或Pull解析器,它们以...

    DOM4J xml解析工具

    1. **解析XML文档**:DOM4J可以使用SAX或DOM方式解析XML文件。SAX是事件驱动的解析器,适用于大文件,而DOM解析会将整个文档加载到内存,适合小文件。DOM4J的灵活性在于,可以根据需求选择合适的解析策略。 2. **...

    dom4解析xml需要的包

    1. **解析XML**:DOM4J支持使用DOM、SAX或StAX解析器读取XML文件,其中DOM是将整个XML文档加载到内存中,适用于小型文件;SAX是事件驱动的解析,适用于大文件;而StAX则提供了一种更高效的方式,通过迭代器逐个处理...

    java dom 解析 xml 实例

    Java DOM 解析 XML 实例是 Java 语言中常用的 XML 解析方法之一,使用 W3C 推荐的文档对象模型(Document Object Model,DOM)来解析 XML 文档。DOM 提供了一个树形结构的对象模型,通过遍历树形结构可以访问和操作 ...

    android Dom解析xml文件

    本篇文章将深入探讨Android中的DOM解析XML文件,包括其基本原理、实现步骤和一些实用技巧。 ### 1. DOM解析的基本概念 DOM解析是一种将XML文件转换为内存中对象模型的方法。它将XML文档视为一棵树,其中每个元素、...

    DOM解析xml文件实例讲解

    本篇文章将深入探讨DOM解析XML文件在Android中的应用实例。 首先,DOM解析的基本思想是将整个XML文件加载到内存中,形成一个树形结构,即DOM树。这样做的优点是解析后的数据可以方便地进行任意位置的查找和修改,但...

    Android使用DOM方式解析XML

    本篇文章将深入探讨如何使用DOM(文档对象模型)解析XML文件,并将其内容显示在应用程序的用户界面上。 首先,理解DOM解析的基本概念至关重要。DOM是一种标准,允许程序以树形结构访问和操作XML文档的全部内容。它...

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    DOM_XML.rar_DOM_dom xml_dom xml java_dom解析xml_java解析xml

    学习DOM解析XML对于任何需要处理XML数据的Java开发者都是基础且重要的技能,因为它提供了灵活性和强大的功能来创建、修改和分析XML文档。然而,DOM的缺点是内存占用大,对于大型XML文档,可能需要考虑更轻量级的解析...

    Dom JDom 解析xml 文件

    在Java中,解析XML文件是常见的任务,其中DOM(Document Object Model)和JDOM是两种常用的方法。 DOM解析是XML解析的一种方式,它将整个XML文档加载到内存中,形成一个树形结构,称为DOM树。每个节点代表XML文档的...

    用dom解析xml文件

    使用DOM解析XML文件的步骤如下: 1. 加载XML文件:首先,你需要创建一个`DocumentBuilderFactory`对象,然后通过`newDocumentBuilder()`方法得到一个`DocumentBuilder`实例。接着,调用`parse()`方法,传入XML文件...

    Android Dom解析XML

    总结来说,Android中使用DOM解析XML是一种常见且直观的方式,适合处理小规模的数据。结合ButterKnife库,可以方便地将解析结果与UI组件进行绑定,提高代码的可读性和维护性。但请注意,对于大文件,考虑使用SAX或者...

Global site tag (gtag.js) - Google Analytics