1. 在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式(通过Schema和DTD两种约束形式),很难分出胜负。
2. 在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,在许多JavaEE框架中大都采用XML文件的形式,JSON是不能的。
3. 在编码难度方面,XML有丰富的编码工具(Dom、Sax等),JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
4. 在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
5. 在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
6. JSON和XML同样拥有丰富的解析手段。
7. JSON相对于XML来讲,数据的体积小。
8. JSON与JavaScript的交互更加方便。
9. JSON对数据的描述性比XML较差。
10. JSON的速度要远远快于XML。
两种方式难分伯仲,大家可以根据实际业务需要来进行选择。
今天的主要内容是Android的如何解析本地的XML文档,对于拥有过JavaEE编程经验的同学来说,可能会产生固定思维,认为直接在本地磁盘上进行读取,在初学Android的时候我也是这样认为的,毕竟Android借用了Java的API,可是后来发现无法读取到文件内容,到后来才发现,XML文件必须放到Android的程序中,本人常用的方法是在res这个文件夹下面,创建一个raw的子文件夹,将所解析的XML文件拷贝到该文件夹下面。下面是解析代码:
解析代码:
//获得一个解析工厂
SAXParserFactory sf = SAXParserFactory.newInstance();
//通过SaxParser获取一个XMLReader解析器
XMLReader xr = sf.newSAXParser().getXMLReader();
//设置解析所用的Handler对象
xr.setContentHandler(new MyHandler());
//获取一个输入流,输入流中包含未被解析的数据
InputStream is = MainActivity.this.getResources().openRawResource(R.raw.test);
//将数据进行解析
xr.parse(new InputSource(is));
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<workers>
<worker id="0001">
<name>Mary</name>
<sex>W</sex>
<status>K</status>
</worker>
<worker id="0002">
<name>Jack</name>
<sex>M</sex>
<status>Q</status>
</worker>
<worker id="0003">
<name>Mars</name>
<sex>M</sex>
<status>A</status>
</worker>
</workers>
Handler类中的代码:
DefaultHandler实现了ContentHandler DTDHandler EntityResolver ErrorHandler类,此处Android采用了Adaptor的设计模式,继承者可以自由选择实现其中的方法,而不必去实现无用的方法
public class MyHandler extends DefaultHandler{
String tagName;
String name,sex,status;
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("开始解析文档------------------------------>");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
tagName = localName;
//如果标签的名字为Worker的话,循环它的属性
if(localName.equals("worker")){
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getLocalName(i)+":"+attributes.getValue(i));
}
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
if(tagName.equals("name")){
name = new String(ch,start,length);
}else if(tagName.equals("sex")){
sex = new String(ch,start,length);
}else if(tagName.equals("status")){
status = new String(ch,start,length);
}
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("文档解析结束------------------------>");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
//代表解析结束,输出解析的值
if(localName.equals("worker")){
System.out.println("name------------>"+name);
System.out.println("sex------------>"+sex);
System.out.println("status------------>"+status);
}
}
}