android学习笔记(02)-Sax解析XML与JSON的解析

Sax解析
--------------

1.解析方式:边读边解析

2.读到特定标签的时候,自动调用相应的方法进行操作

3.不会造成内存的溢出

4.不能修改xml文件

  

Sax解析

 

//SaxParserTest.java

  1 import java.util.ArrayList;
  2 
  3 import javax.xml.parsers.ParserConfigurationException;
  4 import javax.xml.parsers.SAXParser;
  5 import javax.xml.parsers.SAXParserFactory;
  6 
  7 import org.junit.Test;
  8 import org.xml.sax.Attributes;
  9 import org.xml.sax.SAXException;
 10 import org.xml.sax.XMLReader;
 11 import org.xml.sax.helpers.DefaultHandler;
 12 
 13 import com.hzg.xmlParse.bean.Book;
 14 
 15 public class SaxParserTest {
 16     @Test
 17     public void saxParser() throws Exception{
 18         //获取工厂
 19         SAXParserFactory parserFactory = SAXParserFactory.newInstance();
 20         SAXParser saxParser = parserFactory.newSAXParser();
 21         //获取xmlReader通过reader可以试着ContentHandler
 22         XMLReader xmlReader = saxParser.getXMLReader();
 23         //给xmlRead设置contentHandler contentHandler是一个接口里面太多的方法没实现
 24         //不去直接实现contentHandler而是继承他的默认的实现DefaultHandler
 25         xmlReader.setContentHandler(new MyHandler());
 26         xmlReader.parse("Books.xml");
 27         
 28         
 29     }
 30     
 31     private class MyHandler extends DefaultHandler{
 32 
 33         @Override
 34         public void characters(char[] ch, int start, int length) throws SAXException {
 35             String text = new String(ch, start, length);
 36             System.out.println("文本内容"+text);
 37         }
 38 
 39         @Override
 40         public void endDocument() throws SAXException {
 41             System.out.println("wendangjieshu");
 42         }
 43 
 44         @Override
 45         public void endElement(String uri, String localName, String qName) throws SAXException {
 46             System.out.println("jieshu标签<"+ qName +">");
 47         }
 48 
 49         @Override
 50         public void startDocument() throws SAXException {
 51             System.out.println("wendangkaishi");
 52         }
 53 
 54         @Override
 55         public void startElement(String uri, String localName, String qName, Attributes attributes)
 56                 throws SAXException {
 57             System.out.println("开始标签<"+ qName +">");
 58             
 59         }
 60         
 61     }
 62     
 63     
 64     //获取第二本书的售价
 65     @Test
 66     public void saxParserTest2() throws Exception{
 67         SAXParserFactory parserFactory = SAXParserFactory.newInstance();
 68         SAXParser parser = parserFactory.newSAXParser();
 69         XMLReader reader = parser.getXMLReader();
 70         reader.setContentHandler(new DefaultHandler(){
 71             boolean isPrice = false;
 72             int count = 0;
 73             @Override
 74             public void characters(char[] ch, int start, int length) throws SAXException {
 75                 if(isPrice && count == 2){
 76                     System.out.println(new String(ch, start, length));
 77                 }
 78             }
 79 
 80             @Override
 81             public void endElement(String uri, String localName, String qName) throws SAXException {
 82                 if("example:售价".equals(qName)){
 83                     isPrice = false;
 84                 }
 85             }
 86 
 87             @Override
 88             public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
 89                 if("example:售价".equals(qName)){
 90                     isPrice = true;
 91                     count++;
 92                 }
 93             }
 94             
 95         });
 96         reader.parse("Books.xml");
 97     
 98     }
 99     
100     //生成集合
101     @Test
102     public void saxParse2list() throws Exception{
103         SAXParserFactory parserFactory = SAXParserFactory.newInstance();
104         SAXParser parser = parserFactory.newSAXParser();
105         XMLReader reader = parser.getXMLReader();
106         reader.setContentHandler(new DefaultHandler(){
107             ArrayList<Book> bookshelf = null;
108             Book book = null;
109             String tag = null;
110             @Override
111             public void characters(char[] ch, int start, int length) throws SAXException {
112                 if("example:书名".equals(tag)){
113                     book.setTitle(new String(ch,start,length));
114                 }else if("example:作者".equals(tag)){
115                     book.setAuthor(new String(ch,start,length));
116                 }else if("example:售价".equals(tag)){
117                     book.setPrice(new String(ch,start,length));
118                 }
119             }
120 
121             @Override
122             public void endElement(String uri, String localName, String qName) throws SAXException {
123                 //每次标签结束把tag设置为null
124                 tag = null;
125                 if("example:书架".equals(qName)){
126                     for(Book book1:bookshelf){
127                         System.out.println(book1);
128                     }
129                 }else if("example:书".equals(qName)){
130                     //读到书的结束标签 把book对象添加到集合中
131                     bookshelf.add(book);
132                 }
133             }
134 
135             @Override
136             public void startElement(String uri, String localName, String qName, Attributes attributes)
137                     throws SAXException {
138                 if("example:书架".equals(qName)){
139                     //创建集合
140                     bookshelf = new ArrayList<Book>();
141                 }else if("example:书".equals(qName)){
142                     //创建对象
143                     book = new Book();
144                 }else if("example:书名".equals(qName)){
145                     tag = "example:书名";
146                 }else if("example:作者".equals(qName)){
147                     tag = "example:作者";
148                 }else if("example:售价".equals(qName)){
149                     tag = "example:售价";
150                 }
151             }
152             
153         });
154         reader.parse("Books.xml");
155         
156     }
157 }

//Book.java

 1 public class Book {
 2     private String title;
 3     private String author;
 4     private String price;
 5     public String getTitle() {
 6         return title;
 7     }
 8     public void setTitle(String title) {
 9         this.title = title;
10     }
11     public String getAuthor() {
12         return author;
13     }
14     public void setAuthor(String author) {
15         this.author = author;
16     }
17     public String getPrice() {
18         return price;
19     }
20     public void setPrice(String price) {
21         this.price = price;
22     }
23     @Override
24     public String toString() {
25         return "Book [title=" + title + ", author=" + author + ", price=" + price + "]";
26     }
27     
28     
29 }


JSON(JavaScript Object Notation)
--------------
JavaScript对象表示法
规则:
1.映射用冒号(":")表示。名称:值
2.并列的数据之间用(",")分隔。名称1:值1,名称2:值2
3.映射的集合(对象)用大括号("{}")表示。{名称1:值1,名称2:值2}
4.并列的集合(数组)用方括号("[]")表示。
[
{名称1:值1,名称2:值2}
{名称1:值1,名称2:值2}
]
5.元素值可具有的类型:string, number, object, array, true, false, null

JSON的解析
--------------
org.json, json-lib, gson


org.json解析JSON
--------------
官网:http:www.json.org/java/
常见API:

1 //将json字符串转换成JSONObject对象
2 JSONObject jb = new JSONObject(String source);
3 Object get(String key);
4 int getInt(String key);
5 String getString(String key);
6 XXX getXXX(String key);
7 JSONArray getJSONArray(String key);

//将json字符串转成JSONArray对象
 JSONArray jsArray = new JSONArray(String source); 

JSON解析示例:

 1 import org.json.*;
 2 
 3 public class JsonParseDemo {
 4     
 5     public  static void main(String [] args) throws Exception{
 6         jsonTest();
 7     }
 8     
 9     public static void jsonTest() throws Exception{
10         //
11         String jstring = "{'name':'是否','age':'20'}";
12         //通过一个具有json格式的字符串可以创建一个json对象
13         JSONObject obj = new JSONObject(jstring);
14         //获取json对象之后就可以通过key去取值
15         String name = obj.getString("name");
16         int age = obj.getInt("age");
17         System.out.println("名字"+name+"age"+age);
18         
19         
20         //遍历name
21         String jsonArray = "[{'name':'是否','age':'20'},{'name':'adf','age':'25'}]";
22         //根据一个具有json数组格式的字符串创建一个json数组对象
23         JSONArray array = new JSONArray(jsonArray);
24         for(int i = 0; i< array.length();i++){
25             //根据索引取出每一个jsonobject
26             JSONObject jsonObject = array.getJSONObject(i);
27             //
28             name = jsonObject.getString("name");
29             System.out.println(name);
30         }
31         
32     }
33 }
原文地址:https://www.cnblogs.com/8386blogs/p/7297842.html