[Android]四种方式解析字符串----JSON、SAX、DOM、XML

当是练习吧,分别以JSON、SAX、DOM、XML(android.util.XML)来解析字符串。

个人感觉这四种方式的实现由难到易的顺序是:SAX→XML→DOM→JSON。

 

JSON解析的内容如下,文件名为devdiv.json,存于工程的assets目录下:

[xhtml] view plain copy
  1. {  
  2.         "code":"1",  
  3.         "result":{  
  4.             "title":"Devdiv移动开发社区",  
  5.             "title_url":"http://www.devdiv.com/forum.php",  
  6.             "development_forum_name":"开发讨论区",  
  7.             "development_forum":[  
  8.                 {"name":"Windows Phone论坛","url":"http://www.devdiv.com/forum-windows-phone-mobile-1.html"},  
  9.                 {"name":"Android论坛","url":"http://www.devdiv.com/forum-android-1.html"},  
  10.                 {"name":"iOS/iPhone论坛","url":"http://www.devdiv.com/forum-iphone-1.html"}  
  11.                 ]  
  12.         }  
  13. }  

 

剩下三个解析内容如下,文件名为devdiv.xml,存于工程的assets目录下:

[xhtml] view plain copy
  1. <root>  
  2.     <title>Devdiv移动开发社区</title>  
  3.     <body>开发讨论区</body>  
  4.     <item url="http://www.devdiv.com/forum-windows-phone-mobile-1.html">Windows Phone论坛</item>  
  5.     <item url="http://www.devdiv.com/forum-android-1.html">Android论坛</item>  
  6.     <item url="http://www.devdiv.com/forum-iphone-1.html">iOS/iPhone论坛</item>  
  7. </root>  

 

本例子解析后显示效果:

screen

 

对于DOM的解析,在SDK8及以上版本有两种方法。代码如下:

  1. package lab.sodino.string;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.util.Vector;  
  5. import javax.xml.parsers.DocumentBuilder;  
  6. import javax.xml.parsers.DocumentBuilderFactory;  
  7. import javax.xml.parsers.FactoryConfigurationError;  
  8. import javax.xml.parsers.ParserConfigurationException;  
  9. import javax.xml.parsers.SAXParser;  
  10. import javax.xml.parsers.SAXParserFactory;  
  11. import org.json.JSONArray;  
  12. import org.json.JSONException;  
  13. import org.json.JSONObject;  
  14. import org.w3c.dom.Document;  
  15. import org.w3c.dom.Element;  
  16. import org.w3c.dom.Node;  
  17. import org.w3c.dom.NodeList;  
  18. import org.xml.sax.Attributes;  
  19. import org.xml.sax.SAXException;  
  20. import org.xml.sax.helpers.DefaultHandler;  
  21. import android.app.Activity;  
  22. import android.graphics.Typeface;  
  23. import android.os.Build;  
  24. import android.os.Bundle;  
  25. import android.text.SpannableString;  
  26. import android.text.Spanned;  
  27. import android.text.method.LinkMovementMethod;  
  28. import android.text.style.StyleSpan;  
  29. import android.text.style.URLSpan;  
  30. import android.util.Log;  
  31. import android.view.View;  
  32. import android.widget.Button;  
  33. import android.widget.TextView;  
  34. public class TextAct extends Activity {  
  35.     public static final String TAG = "ANDROID_LAB";  
  36.     private Button btnJSON;  
  37.     private Button btnSAX;  
  38.     private Button btnDOM;  
  39.     private Button btnXML;  
  40.     private BtnListener btnListener;  
  41.     private TextView txtInfo;  
  42.     public void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.main);  
  45.         btnListener = new BtnListener();  
  46.         btnDOM = (Button) findViewById(R.id.btnDOM);  
  47.         btnDOM.setOnClickListener(btnListener);  
  48.         txtInfo = (TextView) findViewById(R.id.txtInfo);  
  49.     }  
  50.     private void inflateTextViewByBean(Bean bean) {  
  51.         int spanCount = 4;  
  52.         int[] start = new int[spanCount];  
  53.         int[] end = new int[spanCount];  
  54.         StringBuffer buffer = new StringBuffer();  
  55.         buffer.append(bean.type + "/n");  
  56.         buffer.append(bean.title + "/n");  
  57.         start[0] = buffer.length();  
  58.         buffer.append(bean.development_forum_name + "/n");  
  59.         end[0] = buffer.length();  
  60.         for (int i = 0; i < bean.vecName.size(); i++) {  
  61.             start[i + 1] = buffer.length();  
  62.             buffer.append(bean.vecName.get(i) + "/n");  
  63.             end[i + 1] = buffer.length();  
  64.         }  
  65.         SpannableString spannableString = new SpannableString(buffer.toString());  
  66.         spannableString.setSpan(new StyleSpan(Typeface.ITALIC), start[0], end[0],  
  67.                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  68.         for (int i = 0; i < bean.vecName.size(); i++) {  
  69.             spannableString.setSpan(new URLSpan(bean.vecUrl.get(i)), start[i + 1], end[i + 1],  
  70.                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  71.         }  
  72.         txtInfo.setText(spannableString);  
  73.         txtInfo.setMovementMethod(LinkMovementMethod.getInstance());  
  74.     }  
  75.     class BtnListener implements Button.OnClickListener {  
  76.         public void onClick(View view) {  
  77.             if (view == btnJSON) {  
  78.                 showInfoFromJSON();  
  79.             } else if (view == btnSAX) {  
  80.                 showInfoFromSAXParser();  
  81.             } else if (view == btnDOM) {  
  82.                 showInfoFromDOM();  
  83.             } else if (view == btnXML) {  
  84.                 showInfoFromXML();  
  85.             }  
  86.         }  
  87.     }  
  88.     public void showInfoFromJSON() {  
  89.         Bean bean = new Bean();  
  90.         bean.type = "Inflated by JSON/n";  
  91.         String content = "";  
  92.         InputStream is = null;  
  93.         try {  
  94.             is = getAssets().open("devdiv.json");  
  95.             byte[] data = new byte[is.available()];  
  96.             is.read(data);  
  97.             content = new String(data);  
  98.             Log.d(TAG, "content=" + content);  
  99.             JSONObject jsonContent = new JSONObject(content);  
  100.             int code = jsonContent.getInt("code");  
  101.             // 假设默认code为1时才是正确的json数据。  
  102.             if (code == 1) {  
  103.                 JSONObject jsonResult = jsonContent.getJSONObject("result");  
  104.                 bean.title = jsonResult.getString("title");  
  105.                 bean.development_forum_name = jsonResult.getString("development_forum_name");  
  106.                 bean.vecName = new Vector<String>();  
  107.                 bean.vecUrl = new Vector<String>();  
  108.                 JSONArray devArr = jsonResult.getJSONArray("development_forum");  
  109.                 String tmp = "";  
  110.                 for (int i = 0; i < devArr.length(); i++) {  
  111.                     JSONObject obj = devArr.getJSONObject(i);  
  112.                     tmp = obj.getString("name");  
  113.                     bean.vecName.add(tmp);  
  114.                     tmp = obj.getString("url");  
  115.                     bean.vecUrl.add(tmp);  
  116.                 }  
  117.                 inflateTextViewByBean(bean);  
  118.             } else {  
  119.                 Log.d(TAG, "A error occur when parse a json file.");  
  120.             }  
  121.         } catch (IOException e) {  
  122.             e.printStackTrace();  
  123.         } catch (JSONException e) {  
  124.             e.printStackTrace();  
  125.         } finally {  
  126.             try {  
  127.                 if (is != null) {  
  128.                     is.close();  
  129.                 }  
  130.             } catch (IOException ie) {  
  131.                 ie.printStackTrace();  
  132.             }  
  133.         }  
  134.     }  
  135.     public void showInfoFromXML() {  
  136.         Bean bean = new Bean();  
  137.         bean.type = "Inflated by XML/n";  
  138.         bean.vecName = new Vector<String>();  
  139.         bean.vecUrl = new Vector<String>();  
  140.         MyXMLHandler xmlHandler = null;  
  141.         InputStream is = null;  
  142.         xmlHandler = new MyXMLHandler(bean);  
  143.         try {  
  144.             is = getAssets().open("devdiv.xml");  
  145.             // 一句话就OK了。  
  146.             android.util.Xml.parse(is, android.util.Xml.Encoding.UTF_8, xmlHandler);  
  147.         } catch (IOException e) {  
  148.             e.printStackTrace();  
  149.         } catch (SAXException e) {  
  150.             e.printStackTrace();  
  151.         } finally {  
  152.             try {  
  153.                 if (is != null) {  
  154.                     is.close();  
  155.                 }  
  156.             } catch (IOException ie) {  
  157.                 ie.printStackTrace();  
  158.             }  
  159.         }  
  160.         inflateTextViewByBean(bean);  
  161.     }  
  162.     public void showInfoFromDOM() {  
  163.         Bean bean = new Bean();  
  164.         bean.type = "Inflated by DOM/n";  
  165.         bean.vecName = new Vector<String>();  
  166.         bean.vecUrl = new Vector<String>();  
  167.         InputStream is = null;  
  168.         DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();  
  169.         try {  
  170.             is = getAssets().open("devdiv.xml");  
  171.             NodeList list = null;  
  172.             DocumentBuilder domBuilder = domFactory.newDocumentBuilder();  
  173.             Document doc = domBuilder.parse(is);  
  174.             // 获取根目录  
  175.             Element rootElement = doc.getDocumentElement();  
  176.             // 输出[rootElement=root]  
  177.             Log.d(TAG, "rootElement=" + rootElement.getNodeName());  
  178.             list = rootElement.getElementsByTagName("title");  
  179.             if (Integer.parseInt(Build.VERSION.SDK) >= 8) {  
  180.                 // 在已提前获只有一个title的情况下直接去取list.item(0)  
  181.                 bean.title = list.item(0).getTextContent();  
  182.                 // 在已提前获只有一个body的情况下直接去取list.item(0)  
  183.                 list = rootElement.getElementsByTagName("body");  
  184.                 bean.development_forum_name = list.item(0).getTextContent();  
  185.                 // 多个item的读取情形  
  186.                 list = rootElement.getElementsByTagName("item");  
  187.                 for (int i = 0; i < list.getLength(); i++) {  
  188.                     Node node = list.item(i);  
  189.                     bean.vecUrl.add(node.getAttributes().item(0).getTextContent());  
  190.                     bean.vecName.add(node.getTextContent());  
  191.                 }  
  192.             } else {  
  193.                 // 在已提前获只有一个title的情况下直接去取list.item(0)  
  194.                 bean.title = list.item(0).getFirstChild().getNodeValue();  
  195.                 // 在已提前获只有一个body的情况下直接去取list.item(0)  
  196.                 list = rootElement.getElementsByTagName("body");  
  197.                 bean.development_forum_name = list.item(0).getFirstChild().getNodeValue();  
  198.                 // 多个item的读取情形  
  199.                 list = rootElement.getElementsByTagName("item");  
  200.                 for (int i = 0; i < list.getLength(); i++) {  
  201.                     Node node = list.item(i);  
  202.                     bean.vecUrl.add(node.getAttributes().getNamedItem("url").getNodeValue());  
  203.                     bean.vecName.add(node.getFirstChild().getNodeValue());  
  204.                 }  
  205.             }  
  206.         } catch (ParserConfigurationException e) {  
  207.             e.printStackTrace();  
  208.         } catch (IOException e) {  
  209.             e.printStackTrace();  
  210.         } catch (SAXException e) {  
  211.             e.printStackTrace();  
  212.         } finally {  
  213.             try {  
  214.                 if (is != null) {  
  215.                     is.close();  
  216.                 }  
  217.             } catch (IOException ie) {  
  218.                 ie.printStackTrace();  
  219.             }  
  220.         }  
  221.         inflateTextViewByBean(bean);  
  222.     }  
  223.     public void showInfoFromSAXParser() {  
  224.         Bean bean = new Bean();  
  225.         bean.vecName = new Vector<String>();  
  226.         bean.vecUrl = new Vector<String>();  
  227.         bean.type = "Inflated by SAXParser/n";  
  228.         InputStream is = null;  
  229.         SAXParser parser = null;  
  230.         MyXMLHandler xmlHandler = null;  
  231.         try {  
  232.             parser = SAXParserFactory.newInstance().newSAXParser();  
  233.             xmlHandler = new MyXMLHandler(bean);  
  234.             is = getAssets().open("devdiv.xml");  
  235.             parser.parse(is, xmlHandler);  
  236.             inflateTextViewByBean(bean);  
  237.         } catch (IOException ie) {  
  238.             ie.printStackTrace();  
  239.         } catch (ParserConfigurationException e) {  
  240.             e.printStackTrace();  
  241.         } catch (SAXException e) {  
  242.             e.printStackTrace();  
  243.         } catch (FactoryConfigurationError e) {  
  244.             e.printStackTrace();  
  245.         } finally {  
  246.             try {  
  247.                 if (is != null) {  
  248.                     is.close();  
  249.                 }  
  250.             } catch (IOException ie) {  
  251.                 ie.printStackTrace();  
  252.             }  
  253.         }  
  254.     }  
  255.     class MyXMLHandler extends DefaultHandler {  
  256.         Bean bean;  
  257.         String currentElement;  
  258.         public MyXMLHandler(Bean bean) {  
  259.             MyXMLHandler.this.bean = bean;  
  260.         }  
  261.         public void startDocument() throws SAXException {  
  262.             Log.d(TAG, "MyXMLHandler startDocument");  
  263.         }  
  264.         public void endDocument() throws SAXException {  
  265.             Log.d(TAG, "MyXMLHandler endDocument");  
  266.         }  
  267.         public void startElement(String uri, String localName, String qName, Attributes atts)  
  268.                 throws SAXException {  
  269.             // Log.d(TAG, "MyXMLHandler startElement");  
  270.             currentElement = localName;  
  271.             if (localName.equals("item")) {  
  272.                 if (atts != null) {  
  273.                     for (int i = 0; i < atts.getLength(); i++) {  
  274.                         // 本例中atts.getLength()值为1  
  275.                         bean.vecUrl.add(atts.getValue(i));  
  276.                         Log.d(TAG, "add url[" + atts.getValue(i) + "]");  
  277.                     }  
  278.                 }  
  279.             }  
  280.         }  
  281.         public void characters(char[] ch, int start, int length) throws SAXException {  
  282.             String str = new String(ch, start, length);  
  283.             // Log.d(TAG, "MyXMLHandler characters start=" + start + " len=" +  
  284.             // length + " str[" + str  
  285.             // + "]");  
  286.             if (currentElement != null) {  
  287.                 String tmp = new String(ch, start, length);  
  288.                 if (currentElement.equals("title")) {  
  289.                     bean.title = tmp;  
  290.                 } else if (currentElement.equals("body")) {  
  291.                     bean.development_forum_name = tmp;  
  292.                 } else if (currentElement.equals("item")) {  
  293.                     bean.vecName.add(tmp);  
  294.                     Log.d(TAG, "add name[" + tmp + "]");  
  295.                 }  
  296.             }  
  297.         }  
  298.         public void endElement(String uri, String localName, String qName) throws SAXException {  
  299.             Log.d(TAG, "MyXMLHandler endDocument");  
  300.             currentElement = null;  
  301.         }  
  302.     }  
  303.     class Bean {  
  304.         String type;  
  305.         String title;  
  306.         String development_forum_name;  
  307.         Vector<String> vecName;  
  308.         Vector<String> vecUrl;  
  309.     }  
  310. }  

 

本文内容归CSDN博客博主Sodino所有

转载请注明出处:http://blog.csdn.net/sodino/archive/2011/04/06/6305949.aspx


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值