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

Java网络通信——XML和JSON的更多相关文章

  1. java下XML与JSON互相转换的Utils类

    原文:http://heipark.iteye.com/blog/1394844 需要json-lib-2.1-jdk15.jar和xom-1.2.5.jar,maven pom.xml如下: < ...

  2. java 中xml转换为json对象

    1.前提须要jar包: json-lib-2.4-jdk15.jar 和 xom-1.2.5.jar ,maven 仓库: net.sf.json-lib json-lib 2.4 jdk15 xom ...

  3. JAVA 实现XML与JSON 相互转换

    原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,经常碰到XML转为JSON或者JSON转为XML,在这过程中有时嵌 ...

  4. java中Xml、json之间的相互转换

    旁白: 最近关于xml与json之间的转换都搞蒙了,这里写一个demo,以后备用. 正题: project格式是: jar包是一个一个检出来的,还算干净了. 代码: 工具类: package exer ...

  5. java XML转JSON格式

    标签: XML转Json json 2014-05-20 20:55 6568人阅读 评论(6) 收藏 举报  分类: [J2SE基础](20)  代码如下所示,从这个例子中发现了代码库的重要性,如果 ...

  6. json:JSONObject包的具体使用(JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包)

    1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包. 2.下载jar包 http:// ...

  7. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  8. Java 常见数据交换格式——xml、json、yaml

    目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...

  9. analysed of J-SON/XML processing model Extend to java design model (J-SON/XML处理模型分析 扩展到Java设计模型 )

    一.JSON和XML 1.JSON JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.可在不同平台之间进行数据交换.JSON ...

随机推荐

  1. getReadableDatabase 和 getWritableDatabase的区别

    (1)getWritableDatabase()方法以读写方式打开数据库.一旦数据库的磁盘空间满了,数据库就只能读而不能写,此时用getWritableDatabase()打开数据库就会出错. (2) ...

  2. linux 进程监控和自动重启的简单实现(转)

    目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...

  3. centos配置samba

    一.samba服务器的安装与配置 [root@localhost ~]# yum -y install samba samba-common samba-client        samba服务器所 ...

  4. git 使用系列(二)---- 分支和合并

    Branching and Merging The Git feature that really makes it stand apart from nearly every other SCM o ...

  5. boost库之geometry

    环境:win732位旗舰版.VS2010旗舰版.boost 1.55.0版本.坐标系为MM_TEXT Geometry是一个开源的几何计算库,包含了几何图形最基本的操作(也支持复杂的操作),下面我们看 ...

  6. Android抽屉(SlidingDrawer --类似android通知栏下拉效果)

    Android抽屉(SlidingDrawer)的实现发 - 红黑联盟http://www.2cto.com/kf/201301/182507.html 可动态布局的Android抽屉之基础http: ...

  7. 将所需要的图标排成一列组成一张图片,方便管理。li的妙用

    我在做一个网站的header 但是视频教学里面将电话图标,微信图标,以及每一个英文字母右边的小点拼成一副图. (图片的名字是top_ioc.png)拼成的整个图片作为li的背景.通过移动就可以分别将每 ...

  8. CodeForces 681C Heap Operations(模拟)

    比较简单的模拟,建议使用STL优先队列. 代码如下: #include<iostream> #include<cstdio> #include<cstring> # ...

  9. 学习笔记——组合模式Composite

    组合模式,典型的层次结构. 与装饰器类图相似. 区别在于:装饰器模式是为了在接口中增加方法,而组合模式在于层次元素的叠加. ConcreteComponent就是中间结点,可以包含更多的Concret ...

  10. POJ - 3062 Borg Maze

    题目链接:http://poj.org/problem?id=3026 Svenskt Masterskap我程序员/ Norgesmesterskapet 2001 Description The ...