package cn.zhaokai.sax;

 import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler; public class Demo1 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { try {
//解决乱码问题
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//得到输入流
InputStream inputStream = request.getInputStream();
//A single input source for an XML entity
InputSource input = new InputSource(inputStream); //5步 sax解析
//1创建工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//得到解析器
SAXParser sp= factory.newSAXParser();
//3.得到读取器
XMLReader reader = sp.getXMLReader();
//4.设置内容处理器,TagValueHandler是单独写的函数
TagValueHandler handler= new TagValueHandler();
reader.setContentHandler(handler);
//5.读取xml文档内容
reader.parse(input);
//返回识别结果
List list = handler.getList(); //定义输出对象,输出到response
PrintWriter out = response.getWriter(); //输出原始消息
String content1 = "<xml><ToUserName><![CDATA[gh_1c586f95bd68]]></ToUserName><FromUserName><![CDATA[ogNtkuMTj4uOx-DCvLfu8mUDmubM]]></FromUserName><CreateTime>1403313142</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[软件孵化实验室]]></Content><MsgId>6027184051137754303</MsgId></xml>";
String content2 = "<xml><ToUserName><![CDATA[gh_1c586f95bd68]]></ToUserName><FromUserName><![CDATA[ogNtkuMTj4uOx-DCvLfu8mUDmubM]]></FromUserName><CreateTime>1403313091</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[CLICK]]></Event><EventKey><![CDATA[I_SDUT_SIL]]></EventKey></xml>";
out.println("原始消息:");
if(list.get(3).equals("text"))
{
out.println(content1);
out.println("解析结果:");
out.print("FromUserName(来自):");
out.println(list.get(1));
out.print("ToUserName(发送至):");
out.println(list.get(0));
out.print("CreateTime(时间):"); //时间转换
int t = Integer.parseInt((String) list.get(2));
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
out.println(format.format((long)t*1000L)); out.print("MsgType(消息类型):");
out.println(list.get(3));
out.print("Content(文本内容):");
out.println(list.get(4));
out.print("MsgId(文本消息标识号):");
out.println(list.get(5));
}
else
{
out.println(content2);
out.println("解析结果:");
out.print("FromUserName(来自):");
out.println(list.get(1));
out.print("ToUserName(发送至):");
out.println(list.get(0));
out.print("CreateTime(时间):"); //时间转换
int t = Integer.parseInt((String) list.get(2));
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
out.println(format.format((long)t*1000L));
out.print("MsgType(消息类型):");
out.println(list.get(3));
out.print("Event(事件):");
out.println(list.get(4));
out.print("EventKey(事件值):");
out.println(list.get(5)); } } catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//解析xml文档
class TagValueHandler extends DefaultHandler{ List <String> list = new ArrayList(); private String currentTag; //记住当前解析到的是什么标签
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException { currentTag = qName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTag = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException { if("ToUserName".equals(currentTag)){
list.add(new String(ch,start,length));
}
if("FromUserName".equals(currentTag)){
list.add(new String(ch,start,length));
}
if("CreateTime".equals(currentTag)){
list.add(new String(ch,start,length));
}
if("MsgType".equals(currentTag)){
list.add(new String(ch,start,length));
}
if("Content".equals(currentTag)){
list.add(new String(ch,start,length));
}
else if("Event".equals(currentTag)){
list.add(new String(ch,start,length));
}
if("MsgId".equals(currentTag)){
list.add(new String(ch,start,length));
}
else if("EventKey".equals(currentTag))
{
list.add(new String(ch,start,length));
}
} public List getList() {
return list;
}
}

微信消息处理JAXP-sax解析的更多相关文章

  1. javaweb学习总结十二(JAXP对XML文档进行SAX解析)

    一:JAXP使用SAX方式解析XML文件 1:dom解析与sax解析异同点 2:sax解析特点 二:代码案例 1:xml文件 <?xml version="1.0" enco ...

  2. JAXP进行DOM和SAX解析

    1.常用XML的解析方式:DOM和SAX 1)DOM思想:将整个XML加载内存中,形成文档对象,所以对XML操作都对内存中文档对象进行. 2)SAX思想:一边解析,一边处理,一边释放内存资源---不允 ...

  3. 2.2 使用 JAXP 对XML文档进行SAX解析

    使用JAXP 对 XML文档进行 SAX解析: public class Demo1 { /** * 使用JAXP对XML文档进行SAX解析 * @throws Exception * @throws ...

  4. 使用JAXP进行sax解析

    package cn.liuning.sax; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactor ...

  5. JAXP的SAX解析

    * 使用Sax解析XML文档  *   * 使用Sax解析文档和DOM解析不一样.  * 概述:  * 是一种XML解析的替代方法.相比于DOM,SAX是一种速度更快,更有效的方法.它逐行扫描文档,一 ...

  6. XML案例(使用JAXP进行SAX解析)

    1.Book.java package cn.itcast.sax; public class Book { private String name; private String author; p ...

  7. DOM综合案例、SAX解析、StAX解析、DOM4J解析

    今日大纲 1.DOM技术对xml的增删操作 2.使用DOM技术完成联系人管理 3.SAX和StAX解析 4.DOM4J解析 5.XPATH介绍 1.DOM的增删操作 1.1.DOM的增加操作 /* * ...

  8. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  9. Android XML文档解析(一)——SAX解析

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. [__NSCFNumber length]: unrecognized selector sent to instance 0x8b3c310

    出现这种问题一般是你把int类型的数值赋给了NSString. 比如: 你定义了一个NSString类型的属性sex,但是服务端返回的sex字段实际上是NSNumber类型, 你直接把NSNumber ...

  2. GridViewDemo

    GridViewDemo:网格示例 GridView标签内定义列宽,android:columnWidth="120dp". getView()内定义每一个ImageView的大小 ...

  3. 会话—session

    这篇随笔是上一篇的姊妹篇@_@! session       在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下) ...

  4. 页面table的每行都有一个<input type='button' />,如何实现点击按钮在按钮下方弹出一个div,点击空白消失

    \ <input id="test" type="button" />/*按钮*/ <div id="tanchu"> ...

  5. js中关于原型的几个方法

    一.isPrototypeOf()方法,判断一个对象是否是另一个对象的原型 function Student(name,age){ this.name=name; this.age=age; } va ...

  6. 【学习笔记】【C语言】循环结构-do while

    用法: while (条件) {     } do {   } while(条件);   while和do-while的区别 1.很多情况下,while和do while可以互换   2.while特 ...

  7. Access时间日期比较查询的方法总结

    Access日期时间比较查询语句困扰过很多网友,种豆网整理了一下Access日期比较查询的几种方法,假定数据表明为TblName,日期/时间字段名为FDate(这里不能讲FDate设置为字符串,否则比 ...

  8. php29号小结(隔行换色······)

    1.给表单加样式,可以用css.php与js.js这三种,其中最好用php与js,现在很推广用这种. css3样式隔行换色(table中) tr:nth-child(even){ background ...

  9. JAVA:三种集合LIST、SET、MAP

    1. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...

  10. php验证字符串是否以逗号隔开包括中文字符串

    if(preg_match('/^[\x{4e00}-\x{9fa5}\w]+(,[\x{4e00}-\x{9fa5}\w]+)*$/u','体育,娱乐')){ echo 'ok';}