XML解析和JSON
2016-07-08 23:28
429 查看
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种要了解,面试中经常要问到,第三种一定要掌握,在实际开发当中以后会用到。相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories