package cn.xuediit.dom4j; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; /***要导入dom4j-1.6.1.jar * DomXMLString.java(一般而言,只要NETDATA_URL地址访问正常,本程序即可正常运行) * @author xuechong * @time 6/12/2010 12:09 * @src http://eric-619.iteye.com/blog/693154 * @title dom4j调用webservice返回xml形式的String类型的数据(soap头请求方式) * 根据url来定,浏览器中能得到什么,java程序这里就能输出什么 */ @SuppressWarnings("unused") public class Weather{ //远程WebService接口url private static String NETDATA_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"; public static void main(String args[]){ Document document = getWeatherDocument("菏泽"); if(document != null){ System.out.println(document.asXML()); } } public static Document getWeatherDocument(String city){ Document document = null; SAXReader reader = new SAXReader(); String str = ""; Map<String, String> map = new HashMap<String, String>(); reader.getDocumentFactory().setXPathNamespaceURIs(map); try { InputStream inputStream = getSoapInputStream(city); //得到输入流 document = reader.read(inputStream); //将输入流转化为document } catch (Exception e){ e.printStackTrace(); } return document; } public static InputStream getSoapInputStream(String city) throws Exception { try{ String soap = getSoapRequest(city); if(soap == null){ return null; } URL url = new URL(NETDATA_URL); URLConnection conn = url.openConnection(); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); //参数参考http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName conn.setRequestProperty("Content-Length", Integer.toString(soap.length())); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/getWeatherbyCityName"); OutputStream outputStream = conn.getOutputStream(); OutputStreamWriter outputSW = new OutputStreamWriter(outputStream, "utf-8"); outputSW.write(soap); outputSW.flush(); outputSW.close(); InputStream inputStream = conn.getInputStream(); return inputStream; }catch(Exception e){ e.printStackTrace(); return null; } } /** * 获取soap请求头,并替换其中的标志符号为用户的自定义输入符号 * @param city 用户输入城市名 * @return 用户将要发送给服务器的soap请求 */ private static String getSoapRequest(String city){ StringBuilder sb = new StringBuilder(); //参数参考http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName sb.append("<?xml version='1.0' encoding='utf-8'?>" + "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " + "xmlns:xsd='http://www.w3.org/2001/XMLSchema' " + "xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" + "<soap:Body> " + "<getWeatherbyCityName xmlns='http://WebXml.com.cn/'>" + "<theCityName>" + city + "</theCityName> " + "</getWeatherbyCityName>" + "</soap:Body>" + "</soap:Envelope>"); return sb.toString(); } }
1 楼
rainerliu
2010-06-24
支持,不错!
2 楼
beilejiang
2011-03-14
嗯,但是如果返回的数据量很大,如达到了400K,这样的该如何做呢?求教
3 楼
shaomeng95
2011-03-14
兄弟 你这没啥意义啊