微信公众号开发(公交线路查询-JAVA

27 篇文章 1 订阅
8 篇文章 0 订阅
一、Dom4j的使用    在介绍公交线路开发之前,先简单介绍下Dom4j的使用,因为公交线路查询引用的是爱帮公交api,调用结果为xml格式文件,故用到了Dom4j这个包,当然还有其他的包来读取xml文件,如XStream等,详见柳峰老师《微信公众平台应用开发方法、技巧与案例》一书,有详细介绍。
    这里先给一个样例代码,供大家参考:
   1.利用Dom4j创建xml文件
Java代码 
  1. package org.elvis.course.dom4j;
  2. import java.io.FileOutputStream;
  3. import org.dom4j.Attribute;
  4. import org.dom4j.Document;
  5. import org.dom4j.DocumentHelper;
  6. import org.dom4j.Element;
  7. import org.dom4j.io.OutputFormat;
  8. import org.dom4j.io.XMLWriter;
  9. public class MyDom4j {
  10.   public static void main(String[] args){
  11.     //创建文档
  12.     Document document = DocumentHelper.createDocument();
  13.     //设置文档DocType,这里为了举例,添加加hibernate的DocType
  14.     document.addDocType("hibernate-configuration",
  15.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN",
  16.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
  17.         // 文档增加节点,即根节点,一个文档只能有一个根节点,多加出错
  18.         Element root = document.addElement("skills");
  19.         // 添加注释
  20.         root.addComment("第一个技能");
  21.         // 根节点下添加节点
  22.         Element first = root.addElement("skill");
  23.         // 节点添加属性
  24.         first.addAttribute("name""独孤九剑");
  25.         // 节点下添加节点
  26.         Element info = first.addElement("info");
  27.         // 节点设置内容数据
  28.         info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。");
  29.         
  30.         // 同理增加其他节点,内容,属性等
  31.         Element second = root.addElement("skill");
  32.         second.addAttribute("name""葵花宝典");
  33.         Element info2 = second.addElement("info");
  34.         info2.setText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。");
  35.         /**
  36.         * 第二种方法增加节点,内容,属性等。先创建节点,属性,然后使用add加入。
  37.         */
  38.         // 创建节点
  39.         Element third = DocumentHelper.createElement("skill");
  40.         // 将节点加入到根节点中
  41.         root.add(third);
  42.         // 创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者
  43.         Attribute name = DocumentHelper.createAttribute(third, "name""北冥神功");
  44.         // 将属性加入到节点上
  45.         third.add(name);
  46.         // 创建子节点并加入到节点中
  47.         Element info3 = DocumentHelper.createElement("info");
  48.         info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。");
  49.         third.add(info3);
  50.         
  51.         try {
  52.         // 创建格式化类
  53.         OutputFormat format = OutputFormat.createPrettyPrint();
  54.         // 设置编码格式,默认UTF-8
  55.         format.setEncoding("UTF-8");
  56.         // 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
  57.         FileOutputStream fos = new FileOutputStream("d:/skills.xml");
  58.         // 创建xml输出流
  59.         XMLWriter writer = new XMLWriter(fos, format);
  60.         // 生成xml文件
  61.         writer.write(document);
  62.         writer.close();
  63.         } catch (Exception e) {
  64.         e.printStackTrace();
  65.         }
  66.         
  67.   }
  68. }
    2.读取刚才创建的skills.xml文件
Java代码 
  1. package org.elvis.course.dom4j;
  2. import java.io.File;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import org.dom4j.Document;
  6. import org.dom4j.DocumentException;
  7. import org.dom4j.Element;
  8. import org.dom4j.io.SAXReader;
  9. import org.xml.sax.SAXException;
  10. public class ReadDom4j {
  11.   /**
  12.     * @param args
  13.     * @throws SAXException
  14.     */
  15.   public static void main(String[] args) throws SAXException {
  16.     // TODO Auto-generated method stub
  17.     
  18.       try {
  19.         SAXReader reader = new SAXReader();
  20.         //读取刚才创建的XML文件
  21.         reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd"false);
  22.       Document document = reader.read(new File("d:/skills.xml"));
  23.       //取根节点
  24.       Element root = document.getRootElement();
  25.       //取二级节点
  26.       Element skills =  root.element("skill");
  27.       //取三级节点
  28.       List<Element> urlList = root.elements("skill");
  29.       //取节点为Info的值
  30.       String ss1 = urlList.get(0).element("info").getText();
  31.       String ss = skills.element("info").getText();
  32.       System.out.println(ss);
  33.       System.out.println(ss1);
  34.     } catch (DocumentException e) {
  35.       // TODO Auto-generated catch block
  36.       e.printStackTrace();
  37.     }
  38.   }
  39. }
Dom4j的Jar包:
二、公交线路查询开发
    1.主要代码
Java代码 
  1. package org.elvis.yy.gongjiao;
  2. import java.io.InputStream;
  3. import java.io.UnsupportedEncodingException;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;
  6. import java.util.List;
  7. import org.dom4j.Document;
  8. import org.dom4j.Element;
  9. import org.dom4j.io.SAXReader;
  10. import org.elvis.yy.yinyue.Music;
  11. public class AibanggongjiaoService {
  12.   /**
  13.     * 爱帮公交线路查询
  14.     * 根据城市和关键字(线路)查询
  15.     * @param city  城市
  16.     * @param q  线路
  17.     * @return gongjiao
  18.     */
  19.   public static gongjiao searchGongjiao(String city, String q) {
  20.     // 爱帮api地址
  21.     String requestUrl = "http://openapi.aibang.com/bus/lines?app_key=b7fb1e41aa104e9c24b81894d8e5ab48&city={city}&q={q}";
  22.     // 对城市和线路进行编码
  23.     requestUrl = requestUrl.replace("{city}", urlEncodeUTF8(city));
  24.     requestUrl = requestUrl.replace("{q}", urlEncodeUTF8(q));
  25.     // 处理名称、作者中间的空格
  26.     requestUrl = requestUrl.replaceAll("\\+""%20");
  27.     // 查询并获取返回结果
  28.     InputStream inputStream = httpRequest(requestUrl);
  29.     // 从返回结果中解析出gongjiao
  30.     gongjiao gj = parseGongjiao(inputStream);
  31.   
  32.     return gj;
  33.   }
  34.   /**
  35.     * UTF-8编码
  36.     *
  37.     * @param source
  38.     * @return
  39.     */
  40.   private static String urlEncodeUTF8(String source) {
  41.     String result = source;
  42.     try {
  43.       result = java.net.URLEncoder.encode(source, "UTF-8");
  44.     } catch (UnsupportedEncodingException e) {
  45.       e.printStackTrace();
  46.     }
  47.     return result;
  48.   }
  49.   /**
  50.     * 发送http请求取得返回的输入流
  51.     *
  52.     * @param requestUrl 请求地址
  53.     * @return InputStream
  54.     */
  55.   private static InputStream httpRequest(String requestUrl) {
  56.     InputStream inputStream = null;
  57.     try {
  58.       URL url = new URL(requestUrl);
  59.       HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
  60.       httpUrlConn.setDoInput(true);
  61.       httpUrlConn.setRequestMethod("GET");
  62.       httpUrlConn.connect();
  63.       // 获得返回的输入流
  64.       inputStream = httpUrlConn.getInputStream();
  65.     } catch (Exception e) {
  66.       e.printStackTrace();
  67.     }
  68.     return inputStream;
  69.   }
  70.   /**
  71.     * 解析音乐参数
  72.     *
  73.     * @param inputStream 百度音乐搜索API返回的输入流
  74.     * @return Music
  75.     */
  76.   @SuppressWarnings("unchecked")
  77.   private static gongjiao parseGongjiao(InputStream inputStream) {
  78.     gongjiao gj = null;
  79.     try {
  80.       // 使用dom4j解析xml字符串
  81.       SAXReader reader = new SAXReader();
  82.       Document document = reader.read(inputStream);
  83.       // 得到xml根元素
  84.       Element root = document.getRootElement();
  85.       // result_num表示查询得公交路线数量
  86.       String num = root.element("result_num").getText();
  87.       
  88.       // 当公交线路大于0时
  89.       if (!"0".equals(num)) {
  90.         // 公交信息根节点
  91.         List<Element> lines = root.elements("lines");
  92.         List<Element> line = lines.get(0).elements("line");
  93.         
  94.         String name = line.get(0).element("name").getText();
  95.         String info = line.get(0).element("info").getText();
  96.         String stats = line.get(0).element("stats").getText();
  97.         String f_stats = line.get(1).element("stats").getText();
  98.         gj = new gongjiao();
  99.         //获取公交始发站和终点站信息
  100.         gj.setName(name);
  101.         //获取公交价格
  102.         gj.setJiage(info);
  103.         //获取公交正向的各个站点
  104.         gj.setZhengxiang(stats);
  105.         //获取公交反向的信息
  106.         gj.setFanxiang(f_stats);
  107.       }
  108.     } catch (Exception e) {
  109.       e.printStackTrace();
  110.     }
  111.     return gj;
  112.   }
  113.   // 测试方法
  114.   public static void main(String[] args) {
  115.     gongjiao gj = searchGongjiao("营口""206路");
  116.     System.out.println("公交名称:" + gj.getName());
  117.     System.out.println("公交价格:" + gj.getJiage());
  118.     System.out.println("正向公交信息:" + gj.getZhengxiang());
  119.     System.out.println("反向公交信息:" + gj.getFanxiang());
  120.   }
  121. }

gongjiao类
  1. package org.elvis.yy.gongjiao;

  2. public class gongjiao {
  3.    public String getName() {
  4.                 return name;
  5.         }
  6.         public void setName(String name) {
  7.                 this.name = name;
  8.         }
  9.         public String getJiage() {
  10.                 return jiage;
  11.         }
  12.         public void setJiage(String jiage) {
  13.                 this.jiage = jiage;
  14.         }
  15.         public String getZhengxiang() {
  16.                 return zhengxiang;
  17.         }
  18.         public void setZhengxiang(String zhengxiang) {
  19.                 this.zhengxiang = zhengxiang;
  20.         }
  21.         public String getFanxiang() {
  22.                 return fanxiang;
  23.         }
  24.         public void setFanxiang(String fanxiang) {
  25.                 this.fanxiang = fanxiang;
  26.         }
  27. private String name;
  28.    private String jiage;
  29.    private String zhengxiang;
  30.    private String fanxiang;
  31.    
  32. }
微信调用
  1. if(content.startsWith("公交")){
  2.        //将公交2个字及公交后面的+、空格、-等特殊符号去掉
  3.       String keyWord = content.replaceAll("^公交[\\+ ~!@#%^-_=]?", "").trim();
  4.        if(keyWord.equals("")){
  5.         textMessage.setContent("使用指南:输入“翻译”、“歌曲”、“公交”会有相应回复!");
  6.         respXml = MessageUtil.messageToXml(textMessage);
  7.        }else{
  8.        String[] kwArr = keyWord.split("@");
  9.       //城市
  10.        String city = kwArr[0];
  11.         String q = kwArr[1];
  12.        //搜索公交信息
  13.        gongjiao gj = AibanggongjiaoService.searchGongjiao(city, q);
  14.        //未搜索到公交信息
  15.        if(gj == null){
  16.        textMessage.setContent("对不起,没有找到你找的<"+city+">城市或<“+q+”>公交线路。");       
  17.        respXml = MessageUtil.messageToXml(textMessage);
  18.        }else{
  19.        StringBuffer buffer = new StringBuffer();
  20.        buffer.append(emoji.emojis(0x1F68C)).append(gj.getName()).append("\n\n");
  21.        buffer.append(emoji.emojis(0x1F68C)).append(gj.getJiage()).append("\n");
  22.        buffer.append(emoji.emojis(0x1F68C)).append(gj.getZhengxiang()).append("\n");
  23.        buffer.append(emoji.emojis(0x1F68C)).append(gj.getFanxiang()).append("\n\n");               textMessage.setContent(buffer.toString());        
  24.        respXml = MessageUtil.messageToXml(textMessage);
  25.         }
  26. }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值