今天项目中遇到一个需求,就是可以对全球国家地区进行选择。
那么要么就是数据库字典表,要么就是读取本地文件。
这里我们选择读取本地文件,包含中英繁三种语言的文件,可在我的资源中下载。
效果:
首先引入依赖包
dom4j
dom4j
1.6.1
接着是数据分析工具类LocalUtils.java
package xxx.xxx.xxx;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @ClassName LocalUtils
* @Description 世界城市信息工具类
* @Author WangZhiJun
* @Date 2020/3/26 16:03
**/
@Component
public class LocalUtils {
/**
* 所有国家名称List
*/
private static final List COUNTRY_REGION = new ArrayList();
private static LocalUtils localUtil;
private Document document;
private Element rootElement;
public static final String LOCAL_NAME = "LocList_";
LocalUtils(){
super();
}
LocalUtils(String path){
//1.读取
SAXReader reader = new SAXReader();
try {
document = reader.read(path);
} catch (DocumentException e) {
e.printStackTrace();
}
//2.获得根元素
if (document != null) {
rootElement = document.getRootElement();
}
//3.初始化所有国家名称列表
if (rootElement != null) {
Iterator it = rootElement.elementIterator();
Element ele;
while(it.hasNext()){
ele = (Element)it.next();
COUNTRY_REGION.add(ele.attributeValue("Name"));
}
}
}
public List getCountry(){
return COUNTRY_REGION;
}
/**
*
* 据国家名获取该国所有省份
* @param countryName 国家名,从getCountry()从取出
* @return List
*/
private List provinces(String countryName){
Iterator it = rootElement.elementIterator();
List provinces = new ArrayList<>();
Element ele = null;
while(it.hasNext()){
ele = (Element)it.next();
if(ele.attributeValue("Name").equals(countryName)){
provinces = ele.elements();
for (Element e : provinces) {
if ("State".equals(e.getName()) && e.attributeValue("Name") == null) {
provinces = e.elements();
}
}
break;
}
}
return provinces;
}
/**
*
* @author LiuJinan
* @TODO 功能: 根据国家名获取该国所有省份
* @time 2016-8-26 上午9:07:21
* @param countryName 国家名,从getCountry()从取出
* @return List
*/
public List getProvinces(String countryName){
List tmp = this.provinces(countryName);
List list = new ArrayList();
for (Element element : tmp) {
list.add(element.attributeValue("Name"));
}
return list;
}
/**
*
* 功能:根据国家名和省份名,获取该省城市名列表
* @param countryName 国家名
* @param provinceName 省份名
* @return List
*/
private List cities(String countryName, String provinceName){
List provinces = this.provinces(countryName);
List cities = new ArrayList();
//没有这个城市
if(provinces==null || provinces.size()==0){
return cities;
}
for (Element province : provinces) {
if (province.attributeValue("Name").equals(provinceName)) {
cities = province.elements();
break;
}
}
return cities;
}
/**
*
* 跟据国家名和省份名获取城市列表
* @param countryName 国家名
* @param provinceName 省份名
* @return List
*/
public List getCities(String countryName, String provinceName){
List tmp = this.cities(countryName, provinceName);
List cities = new ArrayList();
for (Element element : tmp) {
cities.add(element.attributeValue("Name"));
}
return cities;
}
/**
*
* 功能:根据国家名和省份名,获取该省城市名列表
* @param countryName 国家名
* @param provinceName 省份名
* @return List
*/
private List districts(String countryName, String provinceName, String cityName){
List cities = this.cities(countryName, provinceName);
List districts = new ArrayList();
if(cities==null || cities.size()==0){
return cities;
}
for (Element citie : cities) {
if (citie.attributeValue("Name").equals(cityName)) {
districts = citie.elements();
break;
}
}
return districts;
}
/**
*
* 跟据国家名、省份名、城市名获取区县列表
* @param countryName 国家名
* @param provinceName 省份名
* @param cityName 城市名
* @return List
*/
public List getDistricts(String countryName, String provinceName, String cityName){
List tmp = this.districts(countryName, provinceName, cityName);
List cities = new ArrayList();
for (Element element : tmp) {
cities.add(element.attributeValue("Name"));
}
return cities;
}
public static LocalUtils getInstance(String path){
if(localUtil==null){
localUtil = new LocalUtils(path);
}
return localUtil;
}
public static void main(String[] args) {
LocalUtils localUtils = LocalUtils.getInstance("D:/local/LocList_zh-CN.xml");
System.out.println(localUtils.getCountry());
}
}
service的实现这里把代码贴一下
@Override
public List getLocal(String countryName, String provinceName, String cityName) throws I18nException {
UserBean currentUser = SessionUtils.getNotNullUserBean();
try {
String fileName = localPath + File.separator + LocalUtils.LOCAL_NAME + currentUser.getLanguage() + Constants.FileType.XML;
Logger.info("国际化地区文件路径:"+fileName);
if (localUtils == null) {
localUtils = LocalUtils.getInstance(fileName);
}
if (StringUtils.isEmpty(countryName)) {
return localUtils.getCountry();
} else {
if (StringUtils.isEmpty(provinceName)) {
return localUtils.getProvinces(countryName);
} else {
if (StringUtils.isEmpty(cityName)) {
return localUtils.getCities(countryName, provinceName);
} else {
return localUtils.getDistricts(countryName, provinceName, cityName);
}
}
}
} catch (Exception e) {
throw new I18nException(ErrorCode.Store.STORE_LOCAL_ERROR);
}
}
大家可能不可以直接复制,这里只是简单讲述一下我的思路,地区文件路径localPath是yml文件中配置的,currentUser.getLanguage()是当前登录人的语种选择,因为我们的系统对于不同的用户人群分为了中英繁三种语言。
首先初始化localUtils就会先初始化国家,对于传进来的三个参数国家、省、市,如果都没传,则返回所有国家信息,如果传了国家,则返回这个国家下的所有省,依次类推。。
最后附上资源下载地址:全球国家信息xml数据(含中英繁)