今天项目中遇到一个需求,就是可以对全球国家地区进行选择。

那么要么就是数据库字典表,要么就是读取本地文件。

这里我们选择读取本地文件,包含中英繁三种语言的文件,可在我的资源中下载。

效果:

首先引入依赖包

<dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>

接着是数据分析工具类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<String> COUNTRY_REGION = new ArrayList<String>();
    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<String> getCountry(){
        return COUNTRY_REGION;
    }
 
    /**
     *
     * 据国家名获取该国所有省份
     * @param countryName  国家名,从getCountry()从取出
     * @return    List<Element>
     */
    private List<Element> provinces(String countryName){
        Iterator it =  rootElement.elementIterator();
        List<Element> 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<String>
     */
    public List<String> getProvinces(String countryName){
        List<Element> tmp = this.provinces(countryName);
        List<String> list = new ArrayList<String>();
        for (Element element : tmp) {
            list.add(element.attributeValue("Name"));
        }
        return list;
    }
 
    /**
     *
     *  功能:根据国家名和省份名,获取该省城市名列表
     * @param countryName 国家名
     * @param provinceName 省份名
     * @return List<Element>
     */
    private List<Element> cities(String countryName, String provinceName){
        List<Element> provinces =  this.provinces(countryName);
        List<Element> cities = new ArrayList<Element>();
        //没有这个城市
        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<String>
     */
    public List<String> getCities(String countryName, String provinceName){
        List<Element> tmp =  this.cities(countryName, provinceName);
        List<String> cities = new ArrayList<String>();
        for (Element element : tmp) {
            cities.add(element.attributeValue("Name"));
        }
        return cities;
    }
 
    /**
     *
     *  功能:根据国家名和省份名,获取该省城市名列表
     * @param countryName 国家名
     * @param provinceName 省份名
     * @return List<Element>
     */
    private List<Element> districts(String countryName, String provinceName, String cityName){
        List<Element> cities =  this.cities(countryName, provinceName);
        List<Element> districts = new ArrayList<Element>();
        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<String>
     */
    public List<String> getDistricts(String countryName, String provinceName, String cityName){
        List<Element> tmp =  this.districts(countryName, provinceName, cityName);
        List<String> cities = new ArrayList<String>();
        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<String> 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数据(含中英繁)

Last modification:March 31st, 2020 at 11:32 am
如果觉得我的文章对你有用,请随意赞赏
评论打卡也可以哦,您的鼓励是我最大的动力!