java解析XML获取城市代码
运行前先导入dom4j架包,由于我们公司用的代理服务器所以下面我设置了代理ip,不需要的可直接忽略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | package com.chengshidaima.tools; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.net.URLConnection; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class CityCode { // private Logger log = Logger.getLogger(CityCode.class.getName()); public static void main(String[] args) { try { CityCode cc = new CityCode(); cc.getCityXml(); //System.out.println(doc.asXML()); } catch (Exception e) { e.printStackTrace(); } } /** * 解析 * * @return * @throws Exception */ @SuppressWarnings ( "unchecked" ) private Document getCityXml() throws Exception { /** 新建一个doc 保存结果 */ Document docResult = DocumentHelper.createDocument(); Element addElementRoot = DocumentHelper.createElement( "china" ); String sUrlChina = "http://flash.weather.com.cn/wmaps/xml/china.xml" ; String sChinaProvXml = getUrlString(sUrlChina); Document doc = DocumentHelper.parseText(sChinaProvXml); Element rootElt = doc.getRootElement(); // 获取根节点 //log.info("根节点:" + rootElt.getName()); // 拿到根节点的名称 /** 取得所有省份 */ List<Element> listProv = rootElt.elements( "city" ); // 获取根节点下的子节点 for ( int i = 0 ; i < listProv.size(); i++) { Element elementProv = listProv.get(i); /** 省份名字 */ String sProvName = elementProv.attributeValue( "pyName" ); String sProvNameCN = elementProv.attributeValue( "quName" ); /** 添加节点 */ Element addElementProv = DocumentHelper.createElement( "prov" ); addElementProv.addAttribute( "pyName" , sProvName); addElementProv.addAttribute( "quName" , sProvNameCN); try { //log.info("查询省份:" + sProvNameCN + " 下的城市!"); String sUrlProv = "http://flash.weather.com.cn/wmaps/xml/" + sProvName + ".xml" ; String sProvXml = getUrlString(sUrlProv); Document docProv = DocumentHelper.parseText(sProvXml); Element rootEltProv = docProv.getRootElement(); // 获取省份下的跟节点 List<Element> listCity1 = rootEltProv.elements( "city" ); for ( int j = 0 ; j < listCity1.size(); j++) { Element elementCity1 = listCity1.get(j); String sCityName1 = elementCity1.attributeValue( "pyName" ); String sCityUrl1 = elementCity1.attributeValue( "url" ); String sCityNameCN1 = elementCity1.attributeValue( "cityname" ); System.out.println(sCityNameCN1 + ":" + sCityUrl1); Element addElementMainCity = DocumentHelper.createElement( "city" ); addElementMainCity.addAttribute( "pyName" , sCityName1); addElementMainCity.addAttribute( "quName" , sCityNameCN1); addElementMainCity.addAttribute( "url" , sCityUrl1); try { String sUrlCity1 = "http://flash.weather.com.cn/wmaps/xml/" + sCityName1 + ".xml" ; //log.info("查询主要城市:" + sCityNameCN1 + " 下的城市!"); String sCityXml = getUrlString(sUrlCity1); Document docCity1 = DocumentHelper.parseText(sCityXml); Element rootCity1 = docCity1.getRootElement(); List<Element> listCity2 = rootCity1.elements( "city" ); for ( int k = 0 ; k < listCity2.size(); k++) { Element elementCity2 = listCity2.get(k); String sCityName2 = elementCity2.attributeValue( "pyName" ); String sCityNameCN2 = elementCity2.attributeValue( "cityname" ); String sCityUrl2 = elementCity2.attributeValue( "url" ); if (!sCityUrl1.endsWith(sCityUrl2)) { System.out.println(sCityNameCN2 + ":" + sCityUrl2); } Element addElementCity2 = DocumentHelper.createElement( "city2" ); addElementCity2.addAttribute( "pyName" , sCityName2); addElementCity2.addAttribute( "quName" , sCityNameCN2); addElementCity2.addAttribute( "url" , sCityUrl2); addElementMainCity.add(addElementCity2); } } catch (Exception e) { // log.info("查询主要城市:" + sCityNameCN1 + " 下的城市失败!"); } addElementProv.add(addElementMainCity); } } catch (Exception e) { //log.info("查询省份:" + sProvNameCN + "下的城市失败!"); } addElementRoot.add(addElementProv); } docResult.setRootElement(addElementRoot); return docResult; } /** * 从url获取xml字符串 * * @param sUrl * @return * @throws Exception */ private String getUrlString(String sUrl) throws Exception { String sResult = "" ; StringBuffer sbResult = null ; // log.info("开始连接Url:" + sUrl); sbResult = new StringBuffer(); URL url = new URL(sUrl); // 创建代理服务器 InetSocketAddress addr = new InetSocketAddress( "10.128.6.3" , 808 ); Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // http 代理 URLConnection con = url.openConnection(proxy); BufferedReader br = new BufferedReader( new InputStreamReader(con.getInputStream(), "UTF-8" )); String sLine = null ; while ((sLine = br.readLine()) != null ) { sbResult.append(sLine); } sResult = sbResult.toString(); //log.info("获取到信息:" + sbResult.toString().substring(0, 500)); if (sResult.contains( "html" )) { String sInt = "null" ; Integer.parseInt(sInt); } return sResult; } } |
运行部分结果如下图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix