XML:可扩展性标记语言,主要用来传输和存储数据,相对于HTML的各种标签规范,XML的标签可以让用户根据语义自己进行定义,适用于web传输。

JSON和XML的区别:

(1).XML定义

扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。

XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

(2).JSON定义

JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。

JSON基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。

2.XML和JSON优缺点

(1).XML的优缺点

<1>.XML的优点

  A.格式统一,符合标准;

  B.容易与其他系统进行远程交互,数据共享比较方便。

<2>.XML的缺点

  A.XML文件庞大,文件格式复杂,传输占带宽;

  B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;

  C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;

  D.服务器端和客户端解析XML花费较多的资源和时间。

(2).JSON的优缺点

<1>.JSON的优点:

  A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

  B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;

  C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;

  D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;

  E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

<2>.JSON的缺点

  A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

  B.JSON格式目前在Web Service中推广还属于初级阶段。

3.XML和JSON的优缺点对比

(1).可读性方面。

JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。

(2).可扩展性方面。

XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

(3).编码难度方面。

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

(4).解码难度方面。

XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

(5).流行度方面。

XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

(6).解析手段方面。

JSON和XML同样拥有丰富的解析手段。

(7).数据体积方面。

JSON相对于XML来讲,数据的体积小,传递的速度更快些。

(8).数据交互方面。

JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。

(9).数据描述方面。

JSON对数据的描述性比XML较差。

(10).传输速度方面。

JSON的速度要远远快于XML。

既然有数据的存储,就必然要有数据的读取和解析,解析出来的数据才可以被我们用在web上。在W3C中定义了两种解析XML的两种方式:SAX和DOM

这两种解析方式的程序操作如下:

XML应用程序    《=      DOM接口     《=     XML分析器    《=   XML文档

XML应用程序    《=      SAX接口      《=     XML分析器    《=   XML文档

XML分析器会对XML文档先进行分析,分析结果经过DOM或SAX接口对分析结果进行操作,从而实现间接地对XML文档的访问。

(1)基于DOM的XML解析器

  DOM类型的解析器会将XML文档转换成一颗DOM树,即将元素和元素之间的父子关系转化成一棵树和它的枝干,这种方法的好处是可以任意的控制整个XML文档的内容,但是这种方法有缺点,他需要将整个文档解析成一颗DOM树放在内存中,这就极其占用内存,所以当XML文档比较大,结构复杂时不采用这种解析方式,但在结构简单,比较小的XML文档中这种方式还是应用很广泛的。

  先定义一个简单的XML文档:

<?xml version="1.0" encoding="GBK"?>
<addresslist>
<linkman>
<name>张三</name>
<email>aaa@qq.com</email>
</linkman>
<linkman>
<name>李四</name>
<email>bbb@qq.com</email>
</linkman>
</addresslist>

在DOM解析中有四个核心的操作接口:

(1)document :这个接口就是整个XML文档

  这个接口下的常用方法:

 No. 方法 类型 描述
1 public NodeList getElementsByTagName(String tagname) 普通 根据节点名称取得节点
2 public Element createElement(String tagname) throws DOMException 普通 创建一个制定名称的节点
3 public Text create TextNode(String data) 普通 创建一个文本内容节点
4 Element createElement(String tagName) throws DOMException 普通 创建一个节点元素
5 public Attr createAttribute(String name) throws DOMException 普通 创建一个属性

(2)Node:每一个Node接口代表一个DOM树中的一个节点,是十分重要的一个接口

No. 方法 类型 描述
1 Node appendChild(Node newChild) throws DOMException 普通 在当前节点下增加一个新节点
2 public NodeList getChildNodes() 普通 取得本节点下的全部子节点
3 public Node getFirstChild() 普通 取得本节点下第一个子节点
4 public Node getLastChild() 普通 取得本节点下最后一个子节点
5 public boolean hasChildNodes() 普通 判断是否还有其他节点
6 public boolean hasAttributes() 普通 判断是否还有其他属性
7 String getNodeValue() throws DOMException 普通 取得节点内容

/*throws语句含义:加在方法大括号之前,将方法中没有 try catch 的异常抛出去,交给其他调用该方法的方法 处理,如果其他方法还不处理,可以继续往外throws

详见http://blog.chinaunix.net/uid-26359455-id-3130427.html*/

(3)NodeList:表示一个节点的集合,一般是有顺序关系的一组节点,当文档改变时会直接影响到NodeList集合

No. 方法 类型 描述
1 public int getLength() 普通 取得节点的个数
2 public Node item(int index) 普通 根据索引取得节点对象

(4)NamedNodeMap:表示一组节点和其唯一名称对应的一一对应关系,主要用于属性节点的表示。

一个程序要进行DOM解析操作,要按照如下步骤进行:

(1)建立DocumentBuilderFactory:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

(2)建立DocumentBuilder:DocumentBuilder builder = factory.newDcumentBuilder();

(3)建立Document:Document doc = builder.parse("要读取的文件路径");

(4)建立NodeList:NodeList nl = doc.getElementsByTagName("读取节点");

(5)进行XML信息读取。

参考书上的例子:

读取xml文件内容的Java代码:

 import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMDemo01 {
public static void main(String args[]){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try{ //若try语句中的内容出现错误,则会执行catch语句中的代码
builder = factory.newDocumentBuilder();
}catch(ParserConfigurationException e){
e.printStackTrace(); //弹出出错位置的栈
}
Document doc = null;
try{
          //读取指定路径的XML文件,相当于将所有的xml文档内容读取到内存中,从而将所有的xml文件内容按照节点的定义顺序将其变为一颗内存中的DOM树,供用户解析使用。
          doc = builder.parse("D:"+File.separator+"my_workspace"+File.separator+"dsd"+File.separator+"src"+File.separator+"MyXml.xml");
         }catch(SAXException e){
e.printStackTrace();
}catch
e.printStackTrace();
}
NodeList nl = doc.getElementsByTagName("name");
System.out.println("姓名:"+nl.item(0).getFirstChild().getNodeValue());
} }

xml文件内容:

 <?xml version="1.0" encoding="UTF-8"?>
<xml-body>
<name>张三</name>
</xml-body>

程序运行结果:姓名:张三

(6)用Java程序创建一个XML文件,例程:

 import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.lang.*;
import org.w3c.dom.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMDemo01 {
public static void main(String args[]){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //创建一个DocumentBuilderFactory
DocumentBuilder builder = null;
try{
builder = factory.newDocumentBuilder(); //创建失败
}catch(ParserConfigurationException e){
e.printStackTrace();
}
Document doc = null;
doc=builder.newDocument(); //创建一个Document对象,并让它与builder产生关联
Element addresslist=(Element) doc.createElement("addresslist"); //创建子节点addresslist
Element linkman=(Element) doc.createElement("linkman"); //创建子节点linkman
Element name=doc.createElement("name"); //创建子节点name
Element email=doc.createElement("email"); //创建子节点email
name.appendChild(doc.createTextNode("李四")); //给子节点name中插入文本内容
email.appendChild(doc.createTextNode("22222@qq.com")); //给子节点email中插入文本内容
addresslist.appendChild(linkman); //将子节点linkman插入到addresslist中
linkman.appendChild(name); //将子节点name插入到linkman中
linkman.appendChild(email); //将子节点email插入到linkman中,以上插入语句顺序可变
doc.appendChild(addresslist); //所有节点插入到该文档中
TransformerFactory tf=TransformerFactory.newInstance(); //创建一个类型为TransformFactory的对象实例
Transformer t=null;
try{
t=tf.newTransformer();
}catch(TransformerConfigurationException e1){
e1.printStackTrace();
}
t.setOutputProperty(OutputKeys.ENCODING, "GBK"); //设置编码格式
DOMSource source=new DOMSource(doc);
StreamResult result=new StreamResult(new File("d:"+File.separator+"output.xml"));
try{
t.transform(source, result);
}catch(TransformerException e){
e.printStackTrace();
}
}
}

运行结果:

可以看到生成了一个XML文件

通过以上代码,可以看出java生成XML文件编码的思想是,先外后里,即先创建子节点,再创建父节点,将子节点插入父节点,再创建文档,将节点内容插入文档,最后再在计算机中申请空间,将整个文档放入。

DocumentBuilderFactory 

XML解析——DOM解析的更多相关文章

  1. Java XML DOM解析范例源码

    下边内容内容是关于Java XML DOM解析范例的内容.import java.io.InputStream; import java.util.ArrayList; import java.uti ...

  2. 用java操作XML文件(DOM解析方式)

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

  3. XML文件解析DOM解析和SAX解析

    解析一个XML文档有哪些内容解析有:dom和sax两种dom:把整个XML文档放入内存,适合XML随机访问,占用内存资源大sax:事件驱动型的XML解析方式,顺序读取,不用一次装载整个文件,遇到标签会 ...

  4. xml语法、DTD约束xml、Schema约束xml、DOM解析xml

    今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...

  5. 使用jaxp对比xml进行DOM解析

    /*DOM解析编程 •遍历所有节点 •查找某一个节点 •删除结点 •更新结点 •添加节点 /* package cn.itcast.jaxp; import java.io.File; import ...

  6. xml它解析----DOM解析

    DOM模型(documentobject model) •DOM解析器在解析XML文档时,会把文档中的全部元素,依照其出现的层次关系.解析成一个个Node对象(节点). •在dom中.节点之间关系例如 ...

  7. XML之DOM解析模型

    <?xml version= "1.0" encoding = "UTF-8"> <articles> <article cate ...

  8. mybatis源码-解析配置文件(一)之XML的DOM解析方式

    目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...

  9. Android中XML解析-Dom解析

    Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...

  10. java解析XML之DOM解析和SAX解析(包含CDATA的问题)

    Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...

随机推荐

  1. 手机Android音视频採集与直播推送,实现单兵、移动监控类应用

    最新手机採集推送直播监控以及EasyDarwin开源流媒体平台的版本号及代码: EasyDarwin 开源流媒体云平台:https://github.com/easydarwin EasyClient ...

  2. 图解时间复杂度O(n)

    画一个16个格子.大O表示计算的操作数. 算法1 需要16步. 算法2 算法1的时间复杂度为O(n) 算法2的时间复杂度为O(logn) n为元素个数16 O中的内容为操作的次数 5种常用的时间复杂度

  3. Dictionary subtraction

    Finding the words from the book that are not in the word list from words.txt is a problem you might ...

  4. Word histogram

    Here is a program that reads a file and builds a histogram of the words in the file: process_file lo ...

  5. Debian9.5 WPS for Linux字体配置(字体缺失解决办法)

    启动WPS for Linux后,出现提示"系统缺失字体" . 出现提示的原因是因为WPS for Linux没有自带windows的字体,只要在Linux系统中加载字体即可. 具 ...

  6. ES6学习笔记(十八)Class 的继承

    1.简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链prototype实现继承,要清晰和方便很多. class Point { } class ColorPoin ...

  7. 容器配置https

    生成秘钥库 通过jdk的keytool工具生成秘钥库 keytool -genkeypair -alias "localhost" -keyalg "RSA" ...

  8. 在ubuntu上编译rasbian kernel(for raspberry pi 1)

    raspberry pi官网的编译手册写的简洁有力,照着操作即可 https://www.raspberrypi.org/documentation/linux/kernel/building.md ...

  9. 一:1.1 python程序与数据储存【进制转换】

    二进制 :0 1 [逢二进一]0+0=00+1=11+1=1011+1=100 1 1+ 1------ 100 八进制: 0 1 2 3 4 5 6 7 [逢八进一] 1+7=101+2=3 十进制 ...

  10. 题解 CF383C 【Propagating tree】

    这道题明明没有省选难度啊,为什么就成紫题了QAQ 另:在CF上A了但是洛谷Remote Judge玄学爆零. 思路是DFS序+线段树. 首先这道题直观上可以对于每一次修改用DFS暴力O(n),然后对于 ...