您的位置:首页 > 移动开发 > Android开发

Android解析XML(DOM解析,SAX解析,PULL解析)

2017-03-03 17:39 417 查看
一堆堆乌云,像青色的火焰,在无底的大海上燃烧。大海抓住闪电的箭光,把它们熄灭在自己的深渊里。这些闪电的影子,活像一条条火蛇,在大海里蜿蜒游动,一晃就消失了。

——暴风雨!暴风雨就要来啦!

这是勇敢的海燕,在怒吼的大海上,在闪电中间,高傲地飞翔;这是胜利的预言家在叫喊:

——让暴风雨来得更猛烈些吧!

高尔基《海燕》


我用的是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地址就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: