zoukankan      html  css  js  c++  java
  • Java网络通信——XML和JSON

    XML(Extensible Markup Language)

      定义:一种可扩展的标记性语言

      XML有丰富的编码工具,比如Dom4j、JDom等。

    JSON(JavaScript Object Notation)

      定义:一种轻量级的数据交换格式

      JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

    两者比较

      解析方式

        XML目前有两种解析方式:DOM和SAX。

          DOM:把XML整体看做是一个对象,解析的时候要将整个XML读入到内存中。

          SAX:SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。  

        JSON解析就比较方便多了,他是key/value;可以看做是一个数组。

      编码方式:   XML易读不易写   JSON易写不易读

     DOM4J操作XML

      1、利用DOM4J生成XML

       思路分析:

        <1>DocumentHelper提供了创建Document对象的方法;

            <2>操作这个Document对象,添加节点以及节点下的文本、名称和属性值;

                <3>然后利用XMLWriter写入器把封装的document对象写入到磁盘中;

        问题:用一个记事本直接生成一个xml文件,会出现乱码。这是因为记事本保存的时候选用的编码是操作系统的编码,而中国操作系统的编码为gbk,但是在文件中我们指定了编码格式UTF-8,所以浏览器在解析的时候会按照你的编码(UTF-8)去解析,殊不知在保存的时候已经被偷换了操作系统的编码格式,所以解析不出来。

        解决办法就是:另存的时候选择编码格式UTF-8,消除操作系统编码的影响,这样就能在浏览器中打开文本改写的xml文件。

        问题:如上讨论,既然保存的是操作系统编码,我们何不在代码中设置dom对象的编码方式为GBK,这样浏览器解析的时候按照GBK解析,为何也不起作用?设置语句:document.setXMLEncoding("GBK");

        分析:他只是修改了document在内存中的编码格式,并没有影响到生成xml文件的编码格式,所以你在内存中输出docum对象时,能够看到编码格式确实为GBK,但是生成的XML文件仍然是utf-8格式。我们需要生成xml文件的时候修改下存储格式。代码如下:

    package com.hs;
    
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.XMLWriter;
    
    
    public class ProductXML {
    
        /**
         * @param args
         * 动态添加节点生成XML
         */
        public static void main(String[] args) {
            
            Document document=DocumentHelper.createDocument();//创建一个dom对象
            Element roots=document.addElement("roots");//为dom对象添加一个元素节点
            roots.setText("根节点");
            
            Element root=roots.addElement("root");
            
            Element name=root.addElement("name");
            Element value=root.addElement("value");
            Element descriptionElement=root.addElement("description");
            
            name.setText("ALiSu");
            name.addAttribute("language", "java");
            value.setText("浙江大学");
            value.addAttribute("major", "ESE");
            descriptionElement.setText("本科毕业于东北大学,研究生毕业于浙江大学ESE实验室,即将工作于阿里巴巴。");
            descriptionElement.addAttribute("job", "Java");
            
            //将动态生成的DOM对象转化为字符串输出,输出到控制台
            System.out.println(document.asXML());
            
            //将XML输出到磁盘文件
            
            try {
    //            Writer writer=new FileWriter("FirstXML.xml");

    OutputStreamWriter writer=new OutputStreamWriter(new FileOutputStream("FirstXML.xml"),"utf-8");
    XMLWriter xmlWriter
    =new XMLWriter(writer);//这里的writer最好是能够带编码格式的,Filewriter出问题的原因就是FileWriter不能处理编码。 xmlWriter.write(document); xmlWriter.flush(); xmlWriter.close(); } catch (IOException e) { e.printStackTrace(); } } }

      乱码问题总结

    1.  用字符流向文件写入数据默认使用本地码表即"gb2312",所以如果文件的编码为"UTF-8",此时应该注意转码,否则将会出现乱码。
    2.  任何对象读入内存都是以"UTF-8"编码的形式存在, 默认情况下XMLWriter的write方法是以"UTF-8"的编码形式将内存中的document对象传给文件,所以如果是字节流文件,就不需要考虑乱码。

         总之,用字符流向文件写入数据要考虑乱码问题,而用字节流就不必考虑乱码问题

      2、利用DOM4J解析XML

      参考博客:http://blog.csdn.net/chenghui0317/article/details/11486271

  • 相关阅读:
    centos crash debug
    go get Unknown SSL protocol error in connection to gopkg.in
    Tensorflow serving with Kubernetes
    Spring 集成 Swagger UI
    Docker Registry V2 Garbage Collection
    Docker Registry V2 with Nginx
    Zabbix磁盘性能监控
    Zabbix CPU utilization监控参数
    Windows挂载Gluster复制卷
    Redis持久化存储(三)
  • 原文地址:https://www.cnblogs.com/sylz/p/5746354.html
Copyright © 2011-2022 走看看