您的位置:首页 > Web前端 > JavaScript

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种要了解,面试中经常要问到,第三种一定要掌握,在实际开发当中以后会用到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml json android