JSON

Android开发学习之路-网络编程之xml、json

字号+ 作者:H5之家 来源:H5之家 2017-06-13 13:03 我要评论( )

Android开发学习之路--网络编程之xml、json 一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的式,协议

当前位置:我的异常网» 编程 » Android开发学习之路-网络编程之xml、json

Android开发学习之路-网络编程之xml、json

  网友分享于:2013-02-24  浏览:0次

Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的。常用的就是xml和json了。在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考。安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了:


    这个就表示服务器已经运行了,具体的代码都是放在这个/Applications/XAMPP/htdocs目录下的。然后待会儿编写个xml文件也放在这里。 编写个简单的xml文件吧。

<Person>

  2  <Teacher>

  3     <name>xiao hong</name>

  4    <age>25</age>

  5    <sex>woman</sex>

  6    <class>english</class>

  7  </Teacher>

  8  <Student>

  9     <name>xiao ming</name>

 10    <age>15</age>

 11    <sex>man</sex>

 12  </Student>

 13 </Person>

 14 


    这里为了方便,我在htdocs下面新建了一个test文件夹,然后再新建了一个person.xml文件,习惯了用vim,这里就用vim来实现了一把,保存退出后,我们去看下效果,打开chrome浏览器,输入。发现浏览器如下图所示:


    显示的内容就是我们文件的内容,接下去通过app去获取这个信息。

    xml解析主要有三种方式,SAX,Pull,Dom。下面就用这几种方法来实现下。

    首先是SAX方式,SAX方式主要是两部分组成,一部分是解析器,也就是XMLReader接口,负责读取XML文档,另一部分是事件处理器ContentHandler,负责对发送事件响应和进行XML文档处理。

    继承DefaultHandler,并重写5个父类的方法。

    1、startDocument方法:开始XML解析的时候调用。

    2、startElement方法:开始解析某个节点的时候调用。

    3、characters方法:获取节点内容的时候调用。

    4、endElement方法:解析完某个节点的时候调用。

    5、endDocument方法:完成XML解析时候调用。

    先新建类SAXContentHandler类,继承DefaultHandler类,编写代码如下:

package com.jared.emxmlstudy; import android.util.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * Created by jared on 16/2/19. */ public class SAXContentHandler extends DefaultHandler { private static final String TAB = "SAXContentHandler"; private String nodeName; private StringBuffer mName; private StringBuffer mAge; private StringBuffer mSex; private StringBuffer mClass; @Override public void startDocument() throws SAXException { mName = new StringBuffer(); mAge = new StringBuffer(); mSex = new StringBuffer(); mClass = new StringBuffer(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { nodeName = localName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if("name".equals(nodeName)) { mName.append(ch, start, length); }else if("age".equals(nodeName)) { mAge.append(ch, start, length); } else if("sex".equals(nodeName)) { mSex.append(ch, start, length); } else if("class".equals(nodeName)) { mClass.append(ch, start, length); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("Teacher".equals(localName)) { Log.d(TAB, "This is Teacher"); Log.d(TAB, "name is:" + mName.toString().trim()); Log.d(TAB, "age is:" + mAge.toString().trim()); Log.d(TAB, "sex is:" + mSex.toString().trim()); Log.d(TAB, "class is:" + mClass.toString().trim()); mName.setLength(0); mAge.setLength(0); mSex.setLength(0); mClass.setLength(0); } else if("Student".equals(localName)) { Log.d(TAB, "This is Student"); Log.d(TAB, "name is:" + mName.toString().trim()); Log.d(TAB, "age is:" + mAge.toString().trim()); Log.d(TAB, "sex is:" + mSex.toString().trim()); mName.setLength(0); mAge.setLength(0); mSex.setLength(0); } } @Override public void endDocument() throws SAXException { } }
    这里要使用三种方法,所以修改布局如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="" xmlns:tools="" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="10dp" tools:context="com.jared.emxmlstudy.MainActivity"> <Button android:id="@+id/getXmlsax" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="SAX方式获取"/> <Button android:id="@+id/getXmlpull" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Pull方式获取"/> <Button android:id="@+id/getXmldom" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Dom方式获取"/> </LinearLayout>
   然后MainActivity中添加代码如下; package com.jared.emxmlstudy; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import java.io.StringReader; import javax.xml.parsers.SAXParserFactory; import cz.msebera.android.httpclient.Header; public class MainActivity extends AppCompatActivity { private static final String xmlUrl = ""; private Button mGetXmlSax; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGetXmlSax = (Button)findViewById(R.id.getXmlsax); mGetXmlSax.setOnClickListener(new myOnClickListener()); } private class myOnClickListener implements View.OnClickListener { @Override public void onClick(View view) { switch (view.getId()) { case R.id.getXmlsax: sendRequestWithAsyncHttpClient(xmlUrl); break; default: break; } } } private void sendRequestWithAsyncHttpClient(String url) { AsyncHttpClient client = new AsyncHttpClient(); client.get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int i, Header[] headers, byte[] bytes) { try { String response = new String(bytes, 0, bytes.length, "utf-8"); parseXMLWithSax(response); } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { } }); } private void parseXMLWithSax(String xmlData) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader xmlReader = factory.newSAXParser().getXMLReader(); SAXContentHandler mHandler = new SAXContentHandler(); xmlReader.setContentHandler(mHandler); xmlReader.parse(new InputSource(new StringReader(xmlData))); } catch (Exception e) { e.printStackTrace(); } } }
    这里用到了AsyncHttpClient,具体库的添加参考上一篇文章Android开发学习之路--网络编程之初体验。好了,这里在发送请求的时候,成功再调用parseXMLWithSax进行解析。这里的地址是192.168.1.102,因为是真机调试,连接到了同一个网段,然后手机就可以访问我们的服务器了。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评