一、Dom4j的使用 在介绍公交线路开发之前,先简单介绍下Dom4j的使用,因为公交线路查询引用的是爱帮公交api,调用结果为xml格式文件,故用到了Dom4j这个包,当然还有其他的包来读取xml文件,如XStream等,详见柳峰老师《微信公众平台应用开发方法、技巧与案例》一书,有详细介绍。
这里先给一个样例代码,供大家参考:
1.利用Dom4j创建xml文件
2.读取刚才创建的skills.xml文件
Dom4j的Jar包:
二、公交线路查询开发
1.主要代码
这里先给一个样例代码,供大家参考:
1.利用Dom4j创建xml文件
- package org.elvis.course.dom4j;
- import java.io.FileOutputStream;
- import org.dom4j.Attribute;
- import org.dom4j.Document;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.XMLWriter;
- public class MyDom4j {
- public static void main(String[] args){
- //创建文档
- Document document = DocumentHelper.createDocument();
- //设置文档DocType,这里为了举例,添加加hibernate的DocType
- document.addDocType("hibernate-configuration",
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN",
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
- // 文档增加节点,即根节点,一个文档只能有一个根节点,多加出错
- Element root = document.addElement("skills");
- // 添加注释
- root.addComment("第一个技能");
- // 根节点下添加节点
- Element first = root.addElement("skill");
- // 节点添加属性
- first.addAttribute("name", "独孤九剑");
- // 节点下添加节点
- Element info = first.addElement("info");
- // 节点设置内容数据
- info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。");
- // 同理增加其他节点,内容,属性等
- Element second = root.addElement("skill");
- second.addAttribute("name", "葵花宝典");
- Element info2 = second.addElement("info");
- info2.setText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。");
- /**
- * 第二种方法增加节点,内容,属性等。先创建节点,属性,然后使用add加入。
- */
- // 创建节点
- Element third = DocumentHelper.createElement("skill");
- // 将节点加入到根节点中
- root.add(third);
- // 创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者
- Attribute name = DocumentHelper.createAttribute(third, "name", "北冥神功");
- // 将属性加入到节点上
- third.add(name);
- // 创建子节点并加入到节点中
- Element info3 = DocumentHelper.createElement("info");
- info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。");
- third.add(info3);
- try {
- // 创建格式化类
- OutputFormat format = OutputFormat.createPrettyPrint();
- // 设置编码格式,默认UTF-8
- format.setEncoding("UTF-8");
- // 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
- FileOutputStream fos = new FileOutputStream("d:/skills.xml");
- // 创建xml输出流
- XMLWriter writer = new XMLWriter(fos, format);
- // 生成xml文件
- writer.write(document);
- writer.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- package org.elvis.course.dom4j;
- import java.io.File;
- import java.util.Iterator;
- import java.util.List;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.xml.sax.SAXException;
- public class ReadDom4j {
- /**
- * @param args
- * @throws SAXException
- */
- public static void main(String[] args) throws SAXException {
- // TODO Auto-generated method stub
- try {
- SAXReader reader = new SAXReader();
- //读取刚才创建的XML文件
- reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
- Document document = reader.read(new File("d:/skills.xml"));
- //取根节点
- Element root = document.getRootElement();
- //取二级节点
- Element skills = root.element("skill");
- //取三级节点
- List<Element> urlList = root.elements("skill");
- //取节点为Info的值
- String ss1 = urlList.get(0).element("info").getText();
- String ss = skills.element("info").getText();
- System.out.println(ss);
- System.out.println(ss1);
- } catch (DocumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
二、公交线路查询开发
1.主要代码
- package org.elvis.yy.gongjiao;
- import java.io.InputStream;
- import java.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.List;
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.elvis.yy.yinyue.Music;
- public class AibanggongjiaoService {
- /**
- * 爱帮公交线路查询
- * 根据城市和关键字(线路)查询
- * @param city 城市
- * @param q 线路
- * @return gongjiao
- */
- public static gongjiao searchGongjiao(String city, String q) {
- // 爱帮api地址
- String requestUrl = "http://openapi.aibang.com/bus/lines?app_key=b7fb1e41aa104e9c24b81894d8e5ab48&city={city}&q={q}";
- // 对城市和线路进行编码
- requestUrl = requestUrl.replace("{city}", urlEncodeUTF8(city));
- requestUrl = requestUrl.replace("{q}", urlEncodeUTF8(q));
- // 处理名称、作者中间的空格
- requestUrl = requestUrl.replaceAll("\\+", "%20");
- // 查询并获取返回结果
- InputStream inputStream = httpRequest(requestUrl);
- // 从返回结果中解析出gongjiao
- gongjiao gj = parseGongjiao(inputStream);
- return gj;
- }
- /**
- * UTF-8编码
- *
- * @param source
- * @return
- */
- private static String urlEncodeUTF8(String source) {
- String result = source;
- try {
- result = java.net.URLEncoder.encode(source, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- return result;
- }
- /**
- * 发送http请求取得返回的输入流
- *
- * @param requestUrl 请求地址
- * @return InputStream
- */
- private static InputStream httpRequest(String requestUrl) {
- InputStream inputStream = null;
- try {
- URL url = new URL(requestUrl);
- HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
- httpUrlConn.setDoInput(true);
- httpUrlConn.setRequestMethod("GET");
- httpUrlConn.connect();
- // 获得返回的输入流
- inputStream = httpUrlConn.getInputStream();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return inputStream;
- }
- /**
- * 解析音乐参数
- *
- * @param inputStream 百度音乐搜索API返回的输入流
- * @return Music
- */
- @SuppressWarnings("unchecked")
- private static gongjiao parseGongjiao(InputStream inputStream) {
- gongjiao gj = null;
- try {
- // 使用dom4j解析xml字符串
- SAXReader reader = new SAXReader();
- Document document = reader.read(inputStream);
- // 得到xml根元素
- Element root = document.getRootElement();
- // result_num表示查询得公交路线数量
- String num = root.element("result_num").getText();
- // 当公交线路大于0时
- if (!"0".equals(num)) {
- // 公交信息根节点
- List<Element> lines = root.elements("lines");
- List<Element> line = lines.get(0).elements("line");
- String name = line.get(0).element("name").getText();
- String info = line.get(0).element("info").getText();
- String stats = line.get(0).element("stats").getText();
- String f_stats = line.get(1).element("stats").getText();
- gj = new gongjiao();
- //获取公交始发站和终点站信息
- gj.setName(name);
- //获取公交价格
- gj.setJiage(info);
- //获取公交正向的各个站点
- gj.setZhengxiang(stats);
- //获取公交反向的信息
- gj.setFanxiang(f_stats);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return gj;
- }
- // 测试方法
- public static void main(String[] args) {
- gongjiao gj = searchGongjiao("营口", "206路");
- System.out.println("公交名称:" + gj.getName());
- System.out.println("公交价格:" + gj.getJiage());
- System.out.println("正向公交信息:" + gj.getZhengxiang());
- System.out.println("反向公交信息:" + gj.getFanxiang());
- }
- }
gongjiao类
微信调用 |
转自http://cloudbbs.org/forum.php?mod=viewthread&tid=23455