XML 与 JSON 数据解析

本文详细介绍了XML的SAX解析方式,利用DefaultHandler处理XML文档的开始、结束、元素和内容。接着,讲解了XML的Pull解析方式及其解析流程。此外,还对比了JSON与XML的优缺点,并展示了JSON解析的基本步骤和实例。最后,提供了XML和JSON之间的转换示例代码。
摘要由CSDN通过智能技术生成

XML解析

SAX解析方式

  • 顺序扫描,当扫描到文档开始与结束,元素开始与结束的地方通知时间处理函数,解析速度快,占用内存少,解析同步
DefaultHandler帮助类
  • 通过该类中方法判断触发事件

  • startDocument
    当读到文档开始标志时,完成初始化操作

  • endDocument
    文档结束,完成善后

  • startElement

  • endElement 在遇到标签结束,调用这个方法

  • characters(ch,start,length) 处理xml读到的内容,ch存放文件的内容

核心代码
//重写DefaultHandler
public class SaxHelper extends DefaultHandler {
    private Person person;
    private ArrayList<Person> persons;
    //要解析的对象
    private String tagName = null;

	//文档开始
    @Override
    public void startDocument() throws SAXException {
        this.persons = new ArrayList<Person>();
    }


    /**
     * 读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组
     */
    @Override
    public void startElement(String uri, String localName, String qName,
                             Attributes attributes) throws SAXException {
        if (localName.equals("person")) {
            person = new Person();
            person.setId(Integer.parseInt(attributes.getValue("id")));
        }
        this.tagName = localName;
    }
    
    // 读内容
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //判断当前标签是否有效
        if (this.tagName != null) {
            String data = new String(ch, start, length);
            //读取标签中的内容
            if (this.tagName.equals("name")) {
                this.person.setName(data);
                Log.i("SAX", "处理name元素内容");
            } else if (this.tagName.equals("age")) {
                this.person.setAge(Integer.parseInt(data));
                Log.i("SAX", "处理age元素内容");
            }
        }
    }

	//读到元素结束
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (localName.equals("person")) {
            this.persons.add(person);//为什么要写上this
            person = null;
        }
        this.tagName = null;
    }

	//读到文档结尾
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    //获取persons集合
    public ArrayList<Person> getPersons() {
        return persons;
    }

}

pull解析方式

  • 采用事件驱动完成xml解析,只需处理开始和结束事件,通常使用switch语句,读到xml返回START_DOCUMENT ,开始标签返回START_TAG , 读到文本返回TEXT,结束标签返回 END_TAG , 结束标签返回 END_DOCUMENT ,
解析流程
  • 获得XmlPullParser类的使用
通过xml解析工厂获得实例
XmlPullParserFactory factory=XmlPullParseFactory.newInstance();
XmlPullParser parser=factory.newPullParse();

直接获得实例
XmlPullParser parser=Xml.newPullParser();
  • 为parse解析器对象提供xml流和编码格式
parser.setInput(xml,"UTF-8");
  • 获得事件类型
int eventType=parser.getEventType();
  • 用switch对不同事件类型进行处理
which(eventType!=XmlPullParser.END_DOCUMENT){
	switch(eventType){
		case XmlPullParser.START_DOCUMENT:
			persons=new ArrayLists<Person>();
			break;
		case XmlPullParser.START_TAG:
			if("person".equals(parser.getName())){
				person=new Person();
				//取出属性值
				int id=Integer.parseInt(parser.getAttributeValue(0));
			}else if("name".equals(parser.getName())){
				String name=parser.nextText();//获取该节点内容
				perser.setName(name);
			}else if("age".equals(parser.getName())){
				int age=Integer.parseInt(parser.nextText());
				person.setAge(age);
			}
			break;
		case XmlPullParser.END_TAG:
			if("Person".equals(parser.getName())){
				parsons.add(person);
				person=null;
			}	
			break;			
	}
	eventType=parser.next();
}

JSON解析

  • Javascript Object Natation轻量级数据交换格式,良好可读可写

Json和xml比较

  • 体积小,与javascript交互更方便,数据描述性差,速度更快

格式规范

// 名称/值对 
 "id":"1","name":"基神","age":"18" },

JSON字符串解析实例

//Person.java
public class Person {
    private String id;
    private String name;
    private String age;
    public void setId(String id){
        this.id = id;
    }
    public String getId(){
        return this.id;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setAge(String age){
        this.age = age;
    }
    public String getAge(){
        return this.age;
    }
    @Override
    //为什么需要toString
    public String toString() {
        return this.name + "~年方:" + this.age;
    }
}
//JSONObject: Json对象,可以完成Json字符串与Java对象的相互转换
//JSONArray: Json数组,可以完成Json字符串与Java集合或对象的相互转换

private void parseDiffJson(String json) {
    try {
        JSONObject jsonObject1 = new JSONObject(json);
        //获取对象
        JSONArray jsonArray = jsonObject1.getJSONArray("ch");
        
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = (JSONObject) jsonArray.get(i);
            String sname = jsonObject.getString("names");
            JSONArray jarray1 = jsonObject.getJSONArray("data");
            JSONArray jarray2 = jsonObject.getJSONArray("times");
        }
        
    } catch (Exception e) {
        e.printStackTrace();
    }

}

核心代码

public static ArrayList<Person> getPersons(InputStream xml)throws Exception
{
    //XmlPullParserFactory pullPaser = XmlPullParserFactory.newInstance();
    ArrayList<Person> persons = null;
    Person person = null;
    // 创建一个xml解析的工厂  
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
    // 获得xml解析类的引用  
    XmlPullParser parser = factory.newPullParser();  
    parser.setInput(xml, "UTF-8");  
    // 获得事件的类型  
    int eventType = parser.getEventType();  
    while (eventType != XmlPullParser.END_DOCUMENT) {  
        switch (eventType) {  
        case XmlPullParser.START_DOCUMENT:  
            persons = new ArrayList<Person>();  
            break;  
        case XmlPullParser.START_TAG:  
            if ("person".equals(parser.getName())) {  
                person = new Person();  
                // 取出属性值  
                int id = Integer.parseInt(parser.getAttributeValue(0));  
                person.setId(id);  
            } else if ("name".equals(parser.getName())) {  
                String name = parser.nextText();// 获取该节点的内容  
                person.setName(name);  
            } else if ("age".equals(parser.getName())) {  
                int age = Integer.parseInt(parser.nextText());  
                person.setAge(age);  
            }  
            break;  
        case XmlPullParser.END_TAG:  
            if ("person".equals(parser.getName())) {  
                persons.add(person);  
                person = null;  
            }  
            break;  
        }  
        eventType = parser.next();  
    }  
    return persons;  
}  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blog....

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值