Android解析XML(DOM解析,SAX解析,PULL解析)
2017-03-03 17:39
417 查看
一堆堆乌云,像青色的火焰,在无底的大海上燃烧。大海抓住闪电的箭光,把它们熄灭在自己的深渊里。这些闪电的影子,活像一条条火蛇,在大海里蜿蜒游动,一晃就消失了。
——暴风雨!暴风雨就要来啦!
这是勇敢的海燕,在怒吼的大海上,在闪电中间,高傲地飞翔;这是胜利的预言家在叫喊:
——让暴风雨来得更猛烈些吧!
我用的是SSM框架写的
Java代码:
UserController.java
UserDao.java
Userentity.java
Userentity.xml
FastJsonHttpMessageConverter.java
index.jsp
在这里的话能不空格就不要空格,要不然Android那边解析会出问题
Android:
activity_main.xml
item_listview.xml
MainActity
ItemTag
Userentity
strings.xml
在values里面的strings.xml我把IP地址写在了这里面,就可以让他在以后的XML解析方便调用就好了
最后要说的是我这里调用的都是数据库里的数据,而不是死的数据,当然要是死的数据那就方便很多了,每次联网的IP地址都会改变,所有每次连上网都要在strings.xml里面改下IP地址就可以了
——暴风雨!暴风雨就要来啦!
这是勇敢的海燕,在怒吼的大海上,在闪电中间,高傲地飞翔;这是胜利的预言家在叫喊:
——让暴风雨来得更猛烈些吧!
高尔基《海燕》
我用的是SSM框架写的
Java代码:
UserController.java
@Controller @RequestMapping("/front/") public class UserController { @Autowired UserDao ud; @RequestMapping("adduser.xhtml") public String AddUser(Userentity userentity,HttpServletRequest request){ String uname=request.getParameter("uname"); String pwd=request.getParameter("pwd"); Userentity user=new Userentity(); user.setUname(uname); user.setPwd(pwd); int n=ud.addUser(user); if(n>0){ System.out.println("增加成功"); }else{ System.out.println("增加失败"); } return "index"; } @RequestMapping("getuser.xhtml") public String getuser(HttpServletRequest request){ List<Userentity> list=new ArrayList<Userentity>(); list=ud.getUsers(); request.setAttribute("list", list); return "index"; } }
UserDao.java
public interface UserDao { public int addUser(Userentity userentiy); public List<Userentity > getUsers();
Userentity.java
public class Userentity { private Integer uid; private String uname; private String pwd; public Userentity(){ } public Userentity(Integer uid, String uname, String pwd) { super(); this.uid = uid; this.uname = uname; this.pwd = pwd; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
Userentity.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zking.dao.UserDao"> <insert id="addUser" parameterType="com.zking.entity.Userentity"> INSERT into user values(null,#{uname},#{pwd}); </insert> <select id="getUsers" resultType="com.zking.entity.Userentity"> select * from user </sele 110c2 ct> </mapper>
FastJsonHttpMessageConverter.java
public class FastJsonHttpMessageConverter extends AbstractHttpMessageConverter<Object> { public final static Charset UTF8 = Charset.forName("UTF-8"); private Charset charset = UTF8; private SerializerFeature[] serializerFeature; @Override protected boolean supports(Class<?> clazz) { return true; } @Override protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream in = inputMessage.getBody(); byte[] buf = new byte[1024]; for (;;) { int len = in.read(buf); if (len == -1) { break; } if (len > 0) { baos.write(buf, 0, len); } } byte[] bytes = baos.toByteArray(); if (charset == UTF8) { return JSON.parseObject(bytes, clazz); } else { return JSON.parseObject(bytes, 0, bytes.length, charset.newDecoder(), clazz); } } @Override protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { OutputStream out = outputMessage.getBody(); byte[] bytes; if (charset == UTF8) { if (serializerFeature != null) { bytes = JSON.toJSONBytes(obj, serializerFeature); } else { bytes = JSON.toJSONBytes(obj, SerializerFeature.WriteDateUseDateFormat); } } else { String text; if (serializerFeature != null) { text = JSON.toJSONString(obj, serializerFeature); } else { text = JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); } bytes = text.getBytes(charset); } out.write(bytes); } }
index.jsp
<?xml version="1.0" encoding="UTF-8" ?><%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@page isELIgnored="false" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><fqs><c:forEach items="${list}" var="fq"> <fq name="${fq.uid}"> <name>${fq.name}</name> <content>${fq.content}</content> <time>${fq.time}</time> </fq> </c:forEach> </fqs>
在这里的话能不空格就不要空格,要不然Android那边解析会出问题
Android:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.zking.risk_android_parsexml.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取XML" android:onClick="getXML" /> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lv_main_list" ></ListView> </LinearLayout>
item_listview.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Large Text" android:id="@+id/tv_item_listview_name" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Large Text" android:id="@+id/tv_item_listview_content" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Large Text" android:id="@+id/tv_item_listview_time" /> </LinearLayout>
MainActity
public class MainActivity extends AppCompatActivity { private ProgressDialog progressDialog; private ListView lv_main_list; private List<Userentity> lists = new ArrayList<>(); private MyAdapter myAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv_main_list = (ListView) findViewById(R.id.lv_main_list); myAdapter = new MyAdapter(); lv_main_list.setAdapter(myAdapter); progressDialog = new ProgressDialog(this); progressDialog.setMessage("正在拼命loading中....."); } class MyAdapter extends BaseAdapter { @Override public int getCount() { Log.i("ListView:",lists.size()+" size:"); return lists.size(); } @Override public Object getItem(int i) { return lists.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if (view == null) { view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview, null); ItemTag itemTag = new ItemTag(); itemTag.tv_name = (TextView) view.findViewById(R.id.tv_item_listview_name); itemTag.tv_content = (TextView) view.findViewById(R.id.tv_item_listview_content); itemTag.tv_time = (TextView) view.findViewById(R.id.tv_item_listview_time); view.setTag(itemTag); } ItemTag itemTag = (ItemTag) view.getTag(); itemTag.tv_name.setText(lists.get(i).getName()); itemTag.tv_content.setText(lists.get(i).getContent()); itemTag.tv_time.setText(lists.get(i).getTime()); return view; } } public void getXML(View view) { new MyTask().execute(); } class MyTask extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); progressDialog.show(); } @Override protected Object doInBackground(Object[] params) { List<Userentity> fqs=new ArrayList<>(); //获取网络数据 //1.定义获取网络的数据的路径 String path = getString(R.string.server_name)+"getuser.xhtml"; try { //2.实例化Url URL url = new URL(path); //3.获取连接对象 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //4.设置请求方式 connection.setRequestMethod("GET"); //5.设置请求连接超时的时间[APP优化] connection.setConnectTimeout(5000); //6.获取响应码 int code = connection.getResponseCode(); if (code == 200) { //7.获取返回过来的数据(XML) InputStream is = connection.getInputStream(); //8.测试(删除-注释) //缓冲字符流 String str = null; // BufferedReader br = new BufferedReader(new InputStreamReader(is)); // // while ((str = br.readLine()) != null) { // Log.i("test", "str"); // } //9.解析XML //方式:DOM SAX PULL //9.1 使用DOM解析 // try { // DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); // DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); // Document document = documentBuilder.parse(is); // //获取根标签 // Element root = document.getDocumentElement(); // Log.i("test", "根标签:" + root.getTagName()); // NodeList nodeList = root.getElementsByTagName("fq"); // Log.i("test", "根标签:" + nodeList.getLength()); // for (int i = 0; i < nodeList.getLength(); i++) { // Element element = (Element) nodeList.item(i); // //获取属性name // String name1 = element.getAttribute("name"); // Log.i("test", name1+""); // // //获取子标签<content><time> // Element elementName = (Element) element.getElementsByTagName("name").item(0); // String name = elementName.getTextContent(); // // Element elementContent = (Element) element.getElementsByTagName("content").item(0); // String content = elementContent.getTextContent(); // // Element elementTime = (Element) element.getElementsByTagName("time").item(0); // String time = elementTime.getTextContent(); // Log.i("test",name + " " + content + " " + time); // // Userentity ut = new Userentity(Integer.parseInt(name1),name, content, time); // fqs.add(ut); // } // } catch (ParserConfigurationException e) { // e.printStackTrace(); // } catch (SAXException e) { // e.printStackTrace(); // } //2.使用SAX解析:特点:边读边解析 基于事件(方法)驱动方式 //开始文档 开始标签 结束标签 结束文档 文本 // try { // SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); // SAXParser saxParser = saxParserFactory.newSAXParser(); // saxParser.parse(is, new DefaultHandler() { // @Override // public void startDocument() throws SAXException { // super.startDocument(); // } // // @Override // public void endDocument() throws SAXException { // super.endDocument(); // } // // @Override // public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // super.startElement(uri, localName, qName, attributes); // currenTag = localName; // if ("fq".equals(localName)) { // //实例化对象 // userentity = new Userentity(); // String name = attributes.getValue(0); // userentity.setName(name); // } // // } // // @Override // public void endElement(String uri, String localName, String qName) throws SAXException { // super.endElement(uri, localName, qName); // // currenTag = null; // if ("fq".equals(localName)) { // fqs.add(userentity); // } // // // } // // @Override // public void characters(char[] ch, int start, int length) throws SAXException { // super.characters(ch, start, length); // // if ("content".equals(currenTag)) { // String content = new String(ch, start, length); // userentity.setContent(content); // } else if ("time".equals(currenTag)) { // String time = new String(ch, start, length); // userentity.setTime(time); // } // } // }); // } catch (ParserConfigurationException e) { // e.printStackTrace(); // } catch (SAXException e) { // e.printStackTrace(); // } //3 使用PULL解析 try { XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(is, "UTF-8"); int type = pullParser.getEventType(); while (type != XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_TAG: //获取开始标签 String startTagName = pullParser.getName(); if ("fq".equals(startTagName)) { userentity1 = new Userentity(); String name = pullParser.getAttributeValue(0); userentity1.setName(name); } else if ("content".equals(startTagName)) { String content = pullParser.nextText(); userentity1.setContent(content); } else if ("time".equals(startTagName)) { String time = pullParser.nextText(); userentity1.setTime(time); } break; case XmlPullParser.END_TAG: //获取结束标签的名字 String endTagName = pullParser.getName(); if ("fq".equals(endTagName)) { fqs.add(userentity1); } break; } //type必须要重新赋值,要不然会导致死循环 type = pullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return fqs; } //更新UI @Override protected void onPostExecute(Object o) { super.onPostExecute(o); List<Userentity> fqs = (List<Userentity>) o; lists.addAll(fqs); myAdapter.notifyDataSetChanged(); progressDialog.cancel(); } } }
ItemTag
public class ItemTag { public TextView tv_uid; public TextView tv_name; public TextView tv_content; public TextView tv_time; }
Userentity
public class Userentity { private int uid; private String name; private String content; private String time; public Userentity(int uid, String name, String content, String time) { super(); this.uid = uid; this.name = name; this.content = content; this.time = time; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() {return content;} public void setContent(String content) { this.content = content; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } }
strings.xml
<string name="server_name">http://193.168.4.59:8080/front/</string>
在values里面的strings.xml我把IP地址写在了这里面,就可以让他在以后的XML解析方便调用就好了
最后要说的是我这里调用的都是数据库里的数据,而不是死的数据,当然要是死的数据那就方便很多了,每次联网的IP地址都会改变,所有每次连上网都要在strings.xml里面改下IP地址就可以了
相关文章推荐
- android-XML解析Dom,Sax,Pull
- Android 使用SAX或者DOM或者pull解析XML文件
- android中解析XML文件方式—DOM SAX PULL
- Android--入门---16---(Android中xml 的生成 & 解析---DOM . SAX . PULL)
- (转)Android中解析XML:SAX、DOM、PULL
- android解析XML的三种方式(DOM,SAX,PULL)
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android解析XML三种方式(PULL、SAX、DOM)
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android用Sax,Pull,Dom解析xml
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- android解析XML总结(SAX、Pull、Dom三种方式)
- 我的Android进阶之旅------>Android中解析XML 技术详解---->SAX解析、DOM解析、PULL解析
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- Android SAX,DOM,PULL解析XML文档
- Android 中利用SAX ,Dom,pull解析 XML 文件
- 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull)
- Android解析XML三种方式(PULL、SAX、DOM)
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)