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

xml和json解析

2016-06-26 12:09 459 查看
Java 支持的xml的Dom解析

         将整个xml读入内存,形成一个Document()对象(倒挂的树)即分支结构。对于大文档读入内存的话很占内存,不建议使用,而对于小文档,操作简单,还可以方便的对内存中的文档增删改查节点。

Java 支持的xml的SAX解析

一边读xml文档,一边解析文档。不适合对文档的增删改查。

 

例子:

Xml文件

<?xmlversion="1.0"encoding="UTF-8"?>
<!-- xml是父节点包含子节点,文本节点 -->
<!-- xml文件中的所有内容都是节点,有文本节点,元素节点 -->
<studentlist><!--节点名 -->
<studentid="1"><!--这是一个元素节点,包含的都是他的子节点,这是学生一 
student是节点名,id是该节点的属性名,1是该学生的编号   本行中‘>’后面有一个换行的文本子节点        文本节点只有内容没有标题
-->
 <name>张三</name><!--
name是元素节点 张三是文本节点,</name>和<grade>之间还有一个换行的文本节点。
-->
    <grade>六年级</grade>   
   </student>
</sutdentlist>

//解析文件需要获取解析文件的流或位置///该解析方法可以理解为一层一层的循环。每层循环是一个子节点的循环,首先一定有元素节点,通过元素节点拿到节点集合,在循环拿其子节点。找元素节点通过逐层循环节点最终拿到文本节点。
    public List<Student>paseDome(InputStreamin){
        List<Student>studnet=null;
        try{
            //3c包的接口Document可以操作xml文档的节点。
            DocumentBuilderbuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
            //Document document=builder.parse(file);//通过builder对象的pase方法获取document对象。pase的参数可以是File即xml文档的位置或者输入流
            Documentdocument=builder.parse(in);//Documnet就代表了存入内存中的文件。拿到Document就可以拿到对应节点,然后就可以对xml增删改查。
           NodeListlist=document.getElementsByTagName("studnet");//Element元素//xml中的每个节点就是一个元素,例如<student
id="1"><!-- 这是学生一  student是节点名,id是该节点的属性名,1是该学生的编号--><student><name>张三</name><grade>六年级</grade></student>其中student代表一个元素,这个元素包含姓名和年级,而name又是一个元素。nodelist也是一个list
            studnet=newArrayList<Student>();
            for(inti=0;i<list.getLength();i++){
                Studentstud=newStudent();
                Elementelement=(Element) list.item(i);//item(i)方法返回Node节点类型
3c包的接口Element元素节点是node的子类
                stud.id=Integer.valueOf(element.getAttribute("id"));//Attribute是属性,通过属性名拿到属性值
                NodeListlists=element.getChildNodes();//获取元素节点的子节点,子节点有多个返回结果是节点集合。其中的左右孩子节点的集合
                for([b]intj=0;j<lists.getLength();i++){
                    //getNodeType()short类型    Node.ELEMENT_NODE元素节点
                    if(lists.item(j).getNodeType()==Node.ELEMENT_NODE){
                         if(lists.item(j).getNodeName().equals("name")){
                             stud.name=lists.item(j).getFirstChild().getNodeValue();//循环到最终的文本节点,最终的文本节点
                         }elseif(lists.item(j).equals("grade")){
                             stud.grade=lists.item(j).getFirstChild().getNodeValue();
                         }
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return studnet;
    }

 

Android的 xml文档的Pull解析

该解析方式是内嵌到开发包的,Android的资源文件通过pull解析,解析资源的xml文件。该解析方式也是一边读取文档一边解析文档。

//pull解析实现
    public List<Student>pull(InputStream in){
        List<Student>studnets=null;
        try {
            XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
            XmlPullParserparser=factory.newPullParser();//获取xmlpull解析的实体类
            parser.setInput(in,"UTF-8");//设置所解析xml文件的输入流,及解析成的格式
            intevent=parser.getEventType();//获取事件
            Studentstudent=null;
            //当事件不是解析到文档结尾时,就循环解析
            while(event!= XmlPullParser.END_DOCUMENT){
                StringnodeName=parser.getName();//一边输入一边读取,每次读取一个节点
                switch(event){
                case XmlPullParser.START_DOCUMENT://开始读取xml文档
                    studnets=newArrayList<JSONjiexi.Student>();
                case XmlPullParser.START_TAG://
标签开始
                    if("person".equals(nodeName)){
                        student=new Student();
                        student.id=Integer.parseInt(parser.getAttributeValue(0));
                    }
                    if("name".equals(nodeName)){
                        student.grade=parser.nextText();//获取下一个文本节点
                    }
                    break;
                case XmlPullParser.END_TAG://
标签结束
                    if("person".equals(nodeName)){
                        studnets.add(student);
                        student=null;
                    }
                    break;
                }
                event=parser.next();//进入下一个标签
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
       
        returnstudnets;
    }

 

 

 

Json解析

Json是一种轻量级的数据交换格式,主要有json对象和json数组,我们可以将json形式的字符串转变为json对象({}开头结尾组成的)或json数组(单独[]组成的)。Json数据是一系列的键值对的集合。

JsonObject对象以‘{’‘}’包裹。其中是一个一个的键值对以key:value形式存在,key只能是String类型,value可以是String、Number、Boolean、null、JsonArray甚至是JsonObject对象,每个键值对以,分隔。

JsonArray又称为有序列表,被理解为数组被‘[’‘]’包裹。数组中的元素可以是String、Number、Boolean、null、JsonObject、或者JsonArray对象,数组中的每个元素,使用逗号分隔。

Json数据打包

Android提供的Json解析类都在org.json下,主要有以下几个:

(1)      JsonObject:Json对象,键值对形式

(2)      JsonArray :有序数值,用toString()函数可以转换为用方括号包裹的有序表字符串

(3)      JsonTokener:Json解析类

例子:

{

         “name”:”xxx”,

         “age”:21,

         “address”:{

                                     “country”:”China”

                                     “province”:”Chongqin”

},

         “phone”:[“1234”,”333”],

         “married”:false

}

创建上面的代码是

 

//自定义JsonObject对象
    public
void
getdata(){
         object=newJSONObject();
        try {
            object.put("name","xxx");
            object.put("age",21);
            JSONObjectaddress=newJSONObject();
            address.put("count","China");
            address.put("province","Chongqin");
            object.put("address",address);
            JSONArraynumber=newJSONArray();
            number.put("1234");
            number.put("333");
            object.put("phone",number);
            object.put("married",false);
        }catch(JSONException e) {
            e.printStackTrace();
        }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息