采用DOM4J中的SAXReader解析webservice返回的XML文件

1.  通过URL连接GET返回的webservice内容,如下代码:

     

			String str = FORECAST_WEATHER_URL + this.getPYName(exter.getCity_code());
			log.info("天气预报查询str is " + str);
			URL url = new URL(str);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setUseCaches(false);
			conn.setConnectTimeout(15000);
			conn.setReadTimeout(15000);
			conn.setRequestMethod("GET");
			InputStream in = conn.getInputStream();
			
//			FileInputStream in = new FileInputStream(new File("d:/weather.xml"));
			
			byte[] bytes = IoUtil.InputStreamToByte(in); 
			InputStream inputStream = new ByteArrayInputStream(bytes); 
			InputStreamReader strInStream = new InputStreamReader(inputStream, "GBK");
			
			SAXReader reader = new SAXReader();
//			reader.setEncoding("UTF-8");
			Document doc = reader.read(strInStream);
			//进行当天天气预报的查询
			List currentList = XMLParseUtil.getParseMapFromXMLStream(doc,XMLPathConstants.CURRENT_WEATHER_XPATH);
			//进行未来天气预报的查询
			List forecastList = XMLParseUtil.getParseMapFromXMLStream(doc,XMLPathConstants.FORECAST_WEATHER_XPATH);

	public final static String CURRENT_WEATHER_XPATH = "//xml_api_reply/weather/current_conditions";
	public final static String FORECAST_WEATHER_XPATH = "//xml_api_reply/weather/forecast_conditions";

2.  通过如下的方法解析XML中的内容

	public static List getParseMapFromXMLStream(Document doc,String parentPath) throws DocumentException {

		List rowList = doc.selectNodes(parentPath);
		Map map = null;
		List list = null;
		if(rowList != null && rowList.size() >0) {
			map = new HashMap();
			list = new ArrayList();
			for(Iterator iter = rowList.iterator();iter.hasNext();){  
	            //获得具体的节点的父元素   
	            Element element = (Element)iter.next();  
	            //获得具体的节点的父元素的属性  
//	            List elementList = element.attributes();  
//	            for(Iterator iter1 = elementList.iterator();iter1.hasNext();){  
//	                //将每个属性转化为一个抽象属性,然后获取其名字和值  
//	                AbstractAttribute aa = (AbstractAttribute)iter1.next();  
//	                System.out.println("Name:"+aa.getName()+";Value:"+aa.getValue());  
//	            }  
//				如果element下有子元素,(类似width="**"),要想获得该子元素的值,可以用如下方法  
//				System.out.println(element.elementText("test"));
	            
				//获得父节点内的各种借点或者属性
				Iterator it1 = element.elementIterator();
				while(it1.hasNext()) {
					Element element1 = (Element)it1.next();  
		            //获得子节点的所有列表  
		            List elementList1 = element1.attributes();  
		            for(Iterator it2 = elementList1.iterator();it2.hasNext();){  
		                //将每个属性转化为一个抽象属性,然后获取其名字和值  
		                AbstractAttribute aa = (AbstractAttribute)it2.next();  
//		                System.out.println("Name11:"+aa.getName()+";Value11:"+aa.getValue());  
		                //这边需要添加借点的名字为KEY的值(重要)
		                map.put(element1.getName(), aa.getValue());
		            }
				}
				list.add(map);
			}
		}	
		return list;
	}

3.   获取的XML内容为:

<?xml version="1.0"?>
<xml_api_reply version="1">
	<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" >
		<forecast_information>
			<city data="Xiamen, Fujian"/>
			<postal_code data="Xiamen"/>
			<latitude_e6 data=""/>
			<longitude_e6 data=""/>
			<forecast_date data="2011-12-15"/>
			<current_date_time data="2011-12-15 16:00:00 +0000"/>
			<unit_system data="SI"/>
		</forecast_information>

		<current_conditions>
			<condition data="多云"/>
			<temp_f data="64"/><temp_c data="18"/>
			<humidity data="湿度: 68%"/>
			<icon data="/ig/images/weather/mostly_cloudy.gif"/>
			<wind_condition data="风向: 东北、风速:5 米/秒"/>
		</current_conditions>
		
		<forecast_conditions>
		    <test>测试用的</test>
			<day_of_week data="周四"/>
			<low data="13"/><high data="22"/>
			<icon data="/ig/images/weather/mostly_sunny.gif"/>
			<condition data="以晴为主"/>
		</forecast_conditions>
		
		<forecast_conditions>
			<day_of_week data="周五"/>
			<low data="11"/><high data="16"/>
			<icon data="/ig/images/weather/mostly_sunny.gif"/>
			<condition data="以晴为主"/>
		</forecast_conditions>
		
		<forecast_conditions>
			<day_of_week data="周六"/>
			<low data="11"/><high data="18"/>
			<icon data="/ig/images/weather/mostly_sunny.gif"/>
			<condition data="以晴为主"/>
		</forecast_conditions>
		
		<forecast_conditions>
			<day_of_week data="周日"/>
			<low data="14"/><high data="21"/>
			<icon data="/ig/images/weather/mostly_sunny.gif"/>
			<condition data="以晴为主"/>
		</forecast_conditions>
	</weather>
</xml_api_reply>





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值