DOM SAX JSON数据解析

本文详细介绍了XML解析的两种常见方法:DOM和SAX,包括DOM的结点类型、解析与存储过程,以及SAX的解析器定义和数据存储。此外,还探讨了JSON作为数据交换格式的特性,解析与存储的方法,并提供了相应的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.DOM操作
   最常用的一种xml解析方式。
   xml基本的结点类型:
  1.Document  代表整个xml文档。
  2.Element  最主要的处理对象。
  3.Node  DOM基本的数据类型。
  4.Attr 元素的属性
  5.Text  Element或者Attr的实际内容
  基本结构如下:
<Element>
   <Node>
	<Element>...</Element>
   </Node>
   
   <Element>

   </Element>
    .
    .
    .
</Element>
 
解析:
InputStream inputStream = null;        //可以通过文件,网络扒的数据实例化
        //创建Document
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = null;
        Document document = null;
        try {
            documentBuilder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        try {
            document = documentBuilder.parse(inputStream);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //返回文档的根(root)元素
        Element rootElement =  document.getDocumentElement();
        //获取一个Node集合
        NodeList nodes = rootElement.getElementsByTagName("Node名字");
        for (int i = 0;i <nodes.getLength();i ++){
            Node childNode = nodes.item(i);
            //判断子Note的类型为元素Note
            if(childNode.getNodeType() == Node.ELEMENT_NODE){
                Element element = (Element) childNode;
                if ("目标节点名字".equals(element.getNodeName())){
                    //获取节点具体内容
                    String text = element.getFirstChild().getNodeName();
                }
            }

        }

存储:
File file = new File(Environment.getExternalStorageDirectory().toString()
                            +File.separator
                            +"文件夹名"
                            +File.separator
                            +"文件名");
        //创建Document
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = null;
        Document document = null;
        try {
            documentBuilder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        document = documentBuilder.newDocument();
        
        //建立各个操作结点
        Element element_1 = document.createElement("element_1名字");
        Element element_2 = document.createElement("element_2名字");
        //设置结点内容
        element_1.appendChild(document.createTextNode("内容"));
        element_2.appendChild(document.createTextNode("内容"));
        //设置结点关系
        element_1.appendChild(element_2);       //element_2为element_1的子节点
        //文档上保存根结点
        document.appendChild(element_1);
        
        //输出文档到文件中
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = null;
        try {
            transformer = transformerFactory.newTransformer();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        }
        
        transformer.setOutputProperty(OutputKeys.ENCODING,"GBK");  //设置编码
        //输出文档
        DOMSource domSource = new DOMSource(document);
        //输出指定位置
        StreamResult streamResult = new StreamResult(file);
        //输出
        try {
            transformer.transform(domSource,streamResult);
        } catch (TransformerException e) {
            e.printStackTrace();
        }
2.SAX操作
 相比而言,DOM操作并不适合进行大数据文件的操作,SAX可能更方便。
 要完成SAX解析,首先必须定义一个SAX解析器:
/**
     * 存储SAX解析得到的数据
     * */
    public class DataFromSAX{
        //定义相关字段存储信息
        //定义getXXX(),setXXX()方法
    }

    public class MySAX extends DefaultHandler{

        private List<DataFromSAX> dataFromSAXList = null;
        private DataFromSAX dataFromSAX = null;
        private String currentElement = null;       //保存元素名称

        /**
         * 文档开始
         * */
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            dataFromSAXList = new ArrayList<>();
        }

        /**
         * 元素开始
         * */
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if ("目标结点(元素)名".equals(localName)){
                dataFromSAX = new DataFromSAX();
            }

            currentElement = localName;
        }

        /**
         * 取得元素内容
         * */
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            if (currentElement != null){        //当前有元素
                String data = new String(ch,start,length);      //记录文字信息
                if ("目标名".equals(currentElement)){
                    //dataFromSAX.setXXX(data);
                }
            }
        }

        /**
         * 元素结束
         * */
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if ("目标结点(元素)名".equals(localName)){
                dataFromSAXList.add(dataFromSAX);
                dataFromSAX = null;                 //清空对象
            }
            currentElement = null;                  //清空元素标记
        }
        
        //取得全部数据集合
        public List<DataFromSAX> getList(){
            return dataFromSAXList;
        }
    }

 调用:
//建立SAX解析工厂
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        //构造解析器
        SAXParser saxParser = null;
        MySAX mySAX = new MySAX();

        try {
            saxParser = saxParserFactory.newSAXParser();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }

        try {
            saxParser.parse(参数1:文件或者流,saxParser);
        } catch (Exception e) {
            e.printStackTrace();
        }

        List<DataFromSAX> list = mySAX.getList();
        //通过list来更新UI

    }

3.JSON操作
     xml文件虽然规范了文件传输定义格式,但是传输数据时会传递许多无用的数据。JSON是一种轻量级的数据交换格式。
    其数据格式大多以JSON对象和JSON数组构成。分别使用JSONObject和JSONArray两个类操作。
    JSON对象:包含在"{ }"中,对象的么一个item都是由键值对表示。键值对之间以","隔开。key只能是String类型,value可以是String,number,boolean,null,Object以及Array数组,即可以嵌套。
   JSON数组:包含在"[ ]"中,数组中的每一个元素类型都可以是String,number,boolean,null,Object类型。元素之间以","隔开。
{"key1":value1,"key2":value2}
value常用类型:
String:表示形式:"存储内容"
Array:表示形式(多嵌套):[{键:值},{}]
   解析时首先分析数据类型,然后确定采用哪种解析技术。有两种技术可选:android内置json包和google开源gson库。
 
  解析:
private List<Map<String,Object>> parseJSON(String data){
        List<Map<String,Object>> list = new ArrayList<>();
        JSONArray jsonArray = null;
        try {
            jsonArray = new JSONArray(data);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        for (int i = 0;i < jsonArray.length();i ++){
            Map<String,Object> map = new HashMap<>();
            JSONObject jsonObject = null;
            try {
                jsonObject = jsonArray.getJSONObject(i);
            } catch (JSONException e) {
                e.printStackTrace();
            }

            //map形式保存数据
            //map.put("...",jsonObject.getXXX("..."));
            list.add(map);
        }
        return list;
    }
存储:
private void restoreJSON(String[] data){
        //根Object
        JSONObject jsonObject = new JSONObject();
        //Object包含Array
        JSONArray jsonArray = new JSONArray();
        for (int i = 0;i < data.length;i ++){
            //Array包含Object
            JSONObject object = new JSONObject();
            try {
                object.put("...",data[i]);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            //Array添加object
            jsonArray.put(object);
        }

        try {
            //根Object添加Array
            jsonObject.put("...",jsonArray);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        File file = new File(Environment.getExternalStorageDirectory().toString()
                            +File.separator
                            +"文件夹名"
                            +File.separator
                            +"文件名");
        if (! file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }

        PrintStream printStream = null;
        try {
            printStream = new PrintStream(new FileOutputStream(file));
            printStream.print(jsonObject.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (printStream != null){
                printStream.close();            //关闭打印流
            }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值