day01學習總結
(1)XML
可擴展標記語言
主要用來傳輸和保存數據
現在一般用做配置文件
(2)DOM解析XML文件
DOM解析原理:DOM 是將XML文檔當作一棵樹型結構,而樹葉被定義爲節點 。
優點:可以進行增刪改查
缺點:由於把整個文檔加載到內存中.所以會造成內存泄露
DOM 解析XML文件一般分爲三步:
1.創建DocumentBuilderFactory對象,調用自身的newInstance()方法
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
2.創建documentBuilder對象
DocumentBuilder db=dbf.newDocumentBuilder();
3.創建解析器,是一個Document類型:
Document parser=db.parser("*.xml");
這三步是用DOM 解析XML文件的必須步驟。接下來的是要利用parser來開始解析文件。
1.得到文檔的根節點root
2.利用getChildNodes()方法獲得他的子節點
NodeList list=root.getChildNodes();
3.利用NodeList的兩個方法,可以遍歷list
for(int i=0;i<list.getLength();i++){
Node node =list.item(i);
}
4.加入元素下面還有子元素,可以繼續重複上面的過程。
5.如果沒有子元素,想得到元素的值,可以這樣:
Elment element =(Element)list.item(i);
Text text =(Text) element2.getFirstChild();
String str=text.getTextContent();
下面附一段DOM 解析XML的例子:
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document parse = db.parse("books.xml");
Element root = parse.getDocumentElement();
//System.out.println(root.getNodeName());
NodeList childNodes = root.getChildNodes();
for(int i=0;i<childNodes.getLength();i++){
Node item = childNodes.item(i);
if(!item.getNodeName().equals("#text")){
System.out.println(item.getNodeName());
Element element =(Element)item;
String id=element.getAttribute("id");
System.out.println("id:"+id);
NodeList childNodes2 = item.getChildNodes();
for(int j=0;j<childNodes2.getLength();j++){
Node item2 = childNodes2.item(j);
if(!item2.getNodeName().equals("#text")){
Element element2 =(Element)item2;
Text text =(Text) element2.getFirstChild();
String str=text.getTextContent();
System.out.println(item2.getNodeName()+":"+str);
}
}
}
}
SAX解析XML
定義:1、簡單應用程序接口(Simple Api For Xml) 他不是官方推薦是一個程序員社區研究出來
原理:一邊解析,一邊處理,一邊釋放
優點:不會有內存泄漏
缺點:不能進行增刪改
SAX解析XML過程:
1.創建SAXParserFactory工廠
SAXParserFactory spf=SAXParserFactory.newInstance();
2.創建解析器並開始解析文件
SAXParser sp = spf.newSAXParser();
sp.parse("books.xml", new MyDefaultHandler());
這裏我們要注意的地方就是parser()方法的第二個參數,它是一個XML解析句柄。
class MyDefaultHandler extends DefaultHandle{
public void startDocument() throws SAXException{}
public void endDocument() throws SAXException{}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException{}
ublic void endElement(String uri, String localName, String qName)
throws SAXException{}
public void characters(char[] ch, int start, int length)
throws SAXException { }
繼承D而faultHandler類,並覆蓋以上5個方法。這5個方法都是系統自動調用的。
XmlPullParser解析XML文件(重點)
Android內置的解析器
進行SAX解析時的第一件事就是要導包,kxml.jar,xmlpull.jar
直接上代碼
List<Book> list=null;
Book book=null;
XmlPullParserFactory xpf =XmlPullParserFactory.newInstance();
XmlPullParser xpp =xpf.newPullParser();
xpp.setInput(new FileInputStream("books.xml"),"UTF-8");
int eventType = xpp.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_TAG:
if(xpp.getName().equals("books")){
list=new ArrayList<Book>();
}else if(xpp.getName().equals("book")){
book=new Book();
}else if(xpp.getName().equals("name")){
String name =xpp.nextText();
book.setName(name);
}else if(xpp.getName().equals("author")){
String author=xpp.nextText();
book.setAuthor(author);
}else if(xpp.getName().equals("price")){
String price=xpp.nextText();
book.setPrice(price);
}
break;
case XmlPullParser.END_TAG:
if(xpp.getName().equals("book")){
list.add(book);
book=null;
}
default:
break;
}
eventType=xpp.next();
}
System.out.println(list);
注意點:
- XmlPullParser的第三步是setInput(inputstream,charSet) ;
- eventType用來判斷是何種事件
- 類似XmlPullParser.END_DOCUMENT的都是XmlPullParser裏面的常量,不用直接用1,2等數字來表示
- 在switch語句中,判斷元素的名字的時候要用解析器,而不是用eventType。例如xpp.getName().equals(“name”);
- switch語句之後一定要用eventType=xpp.next();將指針後移,不然只能遍歷第一個元素。
JSON數據
JSON 是存儲和交換文本信息的語法。類似 XML.
JSON 比 XML 更小、更快,更易解析。
JSON的數據格式有兩種:
1. 對象 { },例如:
{
name:'張三',
age:'18',
}
2. 數組:[{},{},{}],例如:
[ {
name:'張三',
age:'18',
},{
name:'張三',
age:'18',
}]
json解析的實現
來一段代碼就一目瞭然了:
//解析對象
/*String str ="{name:'zhangsan',age:'20'}";
JSONObject object = new JSONObject(str);
String name = object.getString("name");
String age = object.getString("age");
System.out.println(name+" "+age);*/
//解析數組
String str="[{name:'zhangsan',age:'15'},{name:'lisi',age:'20'},"
+ "{name:'xiaoqiang',age:'23',sex:'man'}]";
JSONArray array=new JSONArray(str);
for(int i=0;i<array.length();i++){
JSONObject object = (JSONObject)array.get(i);
String name = object.getString("name");
String age = object.getString("age");
if(i==2){
String sex = object.getString("sex");
System.out.println(name+" "+age+" "+sex);
}else{
System.out.println(name+" "+age);
}
}
總結
今天主要學了2種數據格式和3種解析方式,json更小更方便。3種解析方式中,前2種要了解,面試中經常要問到,第三種一定要掌握,在實際開發當中以後會用到。