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

Android解析xml(DOM SAX PULL)

2017-03-05 09:41 363 查看
也不知在黑暗中究竟沉睡了多久,也不知要有多难才能睁开双眼,我从远方赶来 恰巧你们也在,痴迷流连人间 我为她而狂野,我是这耀眼的瞬间,是划过天边的刹那火焰,我为你来看我不顾一切,我将熄灭永不能再回来,我在这里啊,就在这里啊,惊鸿一般短暂,像夏花一样绚烂,这是一个多美丽又遗憾的世界

——《生如夏花》朴树

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<
4000
/span>() {
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解析提供了很多方法:开始、结束标签;
9149
开始、结束文档;文本的方法。

PULL解析:Pull解析器与SAX解析器性质类似,都是基于事件处理模式。用法不同:Pull解析器需要自己获取事件后做出相当于的操作,pull是用于Android,用于Java中需要导入pull解析依赖包。

特点:解析速度快、使用方便、效率高。

在values里面的strings.xml我把IP地址写在了这里面,就可以让他在以后的XML解析方便调用就好了,因为每次联网的IP地址都会改变,所有每次连网都要在strings.xml里面改下IP地址就可以

最后在清单文件中配置联网权限:

<uses-permission android:name="android.permission.INTERNET" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: