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种要了解,面试中经常要问到,第三种一定要掌握,在实际开发当中以后会用到。