也不知在黑暗中究竟沉睡了多久,也不知要有多难才能睁开双眼,我从远方赶来 恰巧你们也在,痴迷流连人间 我为她而狂野,我是这耀眼的瞬间,是划过天边的刹那火焰,我为你来看我不顾一切,我将熄灭永不能再回来,我在这里啊,就在这里啊,惊鸿一般短暂,像夏花一样绚烂,这是一个多美丽又遗憾的世界
——《生如夏花》朴树
Android端向web端访问数据,web端返回数据xml的形式,Android端自己解析。
首先在web端新建一个ssm框架的项目:
数据直接从数据库(MySQL)里面调用,而不是直接写死的数据
最重要的一点就是在JSP里,生成xml的格式时,切记不能空格,对于有些电脑要多加一行代码(<%@page isELIgnored=”false” %>)
开始解析:从web端访问过来的数据解析到listview里
public class MainActivity extends AppCompatActivity {
private ListView lv_main_getdata_xml;
private ProgressDialog progressDialog;
private List<Userentity> Listuser=new ArrayList<>();
private ListViewAdapter listViewAdapter;
String currentTag=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main_getdata_xml = (ListView) findViewById(R.id.lv_main_getdata_xml);
listViewAdapter = new ListViewAdapter();
lv_main_getdata_xml.setAdapter(listViewAdapter);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("正在拼命loading中...");
}
class MyTask extends AsyncTask {
private Userentity user;
private Userentity users;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
@Override
protected Object doInBackground(Object[] params) {
final List<Userentity> Lists=new ArrayList<>();
//获取网络数据
//01.定义获取网络数据的路径
String path =getString(R.string.server_name)+"listuser.xhtml";
try {
//02.实例化URL
URL url = new URL(path);
//03.获取对象链接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//04.设置请求方式
connection.setRequestMethod("GET");
//05.设置链接超时的时间
connection.setConnectTimeout(5000);
//06.获取响应码
int code=connection.getResponseCode();
//Log.i("test"," "+code);
if (code==200) {
//07.获取返回过来的数据(xml)
InputStream is = connection.getInputStream();
//08.测试(删除--注释)
//缓冲字符流
/*String str=null;
BufferedReader br=new BufferedReader(new InputStreamReader(is));
while ((str=br.readLine())!=null){
Log.i("test",str);
}*/
//09.解析XML(DOM SAX PULL)
//09.1 DOM解析
// try {
// DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
// DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
// Document document=documentBuilder.parse(is);
// //获取根标签
// Element root=document.getDocumentElement();
// NodeList nodeList=root.getElementsByTagName("user");
// for (int i = 0; i < nodeList.getLength(); i++) {
// Element element= (Element) nodeList.item(i);
// //获取属性的名字
// String id=element.getAttribute("id");
//
// //获取子标签name pwd
// Element elementName= (Element) element.getElementsByTagName("name").item(0);
// String name=elementName.getTextContent();
// Element elementPwd= (Element) element.getElementsByTagName("pwd").item(0);
// String pwd=elementPwd.getTextContent();
// Log.i("test"," "+id+" "+name+" "+pwd);
//
// Userentity user=new Userentity(id,name,pwd);
// Lists.add(user);
//
// }
// } catch (ParserConfigurationException e) {
// e.printStackTrace();
// } catch (SAXException e) {
// e.printStackTrace();
// }
//09.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);
// currentTag=localName;
// if ("user".equals(localName)){
// //实列化对象
// user = new Userentity();
// String id=attributes.getValue(0);
// user.setUid(id);
// }
// }
// @Override
// public void endElement(String uri, String localName, String qName) throws SAXException {
// super.endElement(uri, localName, qName);
// currentTag=null;
// if ("user".equals(localName)){
// Lists.add(user);
// }
// }
//
// @Override
// public void characters(char[] ch, int start, int length) throws SAXException {
// super.characters(ch, start, length);
// if("name".equals(currentTag)){
// String name=new String(ch,start,length);
// user.setUname(name);
//
// }else if("pwd".equals(currentTag)){
// String pwd=new String(ch,start,length);
// user.setUpwd(pwd);
//
// }
// }
// });
// } catch (ParserConfigurationException e) {
// e.printStackTrace();
// } catch (SAXException e) {
// e.printStackTrace();
// }
//09.3 PULL解析
try {
XmlPullParser xmlPullParser=Xml.newPullParser();
xmlPullParser.setInput(is,"UTF-8");
int type=xmlPullParser.getEventType();
while (type!=xmlPullParser.END_DOCUMENT){
switch (type){
case XmlPullParser.START_TAG:
//获取开始标签的名字
String startNameTag=xmlPullParser.getName();
if("user".equals(startNameTag)){
users = new Userentity();
String id=xmlPullParser.getAttributeValue(0);
users.setUid(id);
}else if("name".equals(startNameTag)){
String name= xmlPullParser.nextText();
users.setUname(name);
}else if("pwd".equals(startNameTag)){
String pwd= xmlPullParser.nextText();
users.setUpwd(pwd);
}
break;
case XmlPullParser.END_TAG:
//获取结束标签的名字
String endTagName=xmlPullParser.getName();
if("user".equals(endTagName)){
Lists.add(users);
}
break;
}
type=xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return Lists;
}
@Override
protected void onPostExecute(Object object) {
super.onPostExecute(object);
List<Userentity> Lists= (List<Userentity>)object;
Listuser.addAll(Lists);
listViewAdapter.notifyDataSetChanged();
progressDialog.cancel();
}
}
public void getDataXML(View view) {
new MyTask().execute();
}
//给listview设置适配器
class ListViewAdapter extends BaseAdapter {
@Override
public int getCount() {
return Listuser.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = getLayoutInflater().inflate(R.layout.activity_textview, null);
//拿控件
TextView list_text_id = (TextView) view.findViewById(R.id.list_text_id);
TextView list_text_name = (TextView) view.findViewById(R.id.list_text_name);
TextView list_text_pwd = (TextView) view.findViewById(R.id.list_text_pwd);
//绑定数值
list_text_id.setText(Listuser.get(position).getUid());
list_text_name.setText(Listuser.get(position).getUname());
list_text_pwd.setText(Listuser.get(position).getUpwd());
return view;
}
}
}
DOM解析:(DocumentBuilder,DocumentBuilderFactory,Document)原生态jdbc低层代码。
特点:解析速度快,一次性解析整个文档。加载大文件时候效率低。
SAX解析:(SAXParser,SAXParserFactory):使用流的形式处理,是一种以基于事件(方法)为驱动的解析器。
特点:边读边解析,解析速度快,占用内存少,同时sax解析提供了很多方法:开始、结束标签;开始、结束文档;文本的方法。
PULL解析:Pull解析器与SAX解析器性质类似,都是基于事件处理模式。用法不同:Pull解析器需要自己获取事件后做出相当于的操作,pull是用于Android,用于Java中需要导入pull解析依赖包。
特点:解析速度快、使用方便、效率高。
在values里面的strings.xml我把IP地址写在了这里面,就可以让他在以后的XML解析方便调用就好了,因为每次联网的IP地址都会改变,所有每次连网都要在strings.xml里面改下IP地址就可以
最后在清单文件中配置联网权限:
<uses-permission android:name="android.permission.INTERNET" />