• 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

  • 相关阅读:
    vue框架-基础5-vue-使用第三方ui组件快速开发页面,vuetify
    vue框架-基础4-vue-使用vue-cli工具
    vue框架-基础3-vue-component组件化开发
    vue框架-基础2-vue生命周期
    vue框架-基础1-vue包引入,指令,模板语言
    python apscheduler的使用研究
    Python中Flask框架SQLALCHEMY_ECHO设置
    通过淘宝镜像下载python3.8.3的安装包
    pycharm 报错Connection to Python debugger failed socket closed
    github fork项目,和删除fork项目
  • 原文地址:https://www.cnblogs.com/sylz/p/5746354.html
Copyright © 2020-2023  润新知