XML
xml是一直数据格式,是不同计算机语言以及平台之间传输的数据格式,该格式早前用来传输数据,现在传输数据有了更好用的JSON以后,xml的作用就主要用于配置环境了,但是还是有很多人用xml来传输。
格式
<?xml version="1.0" encoding="UTF-8"?>
<Books>
<book id = "0001">
<name> 格林童话</name>
<price> 120元 </price>
</book>
<book id = "0002">
<name><![CDATA[ 安徒< >生童话 ]]></name>
<price> 100元 </price>
</book>
</Books>
- 首行是配置
- 然后是根节点,根节点下有很多子节点比如事例中有book,是Books的子节点,子节点还可以创建子节点,比如book中有两个name和price子节点。
- 子节点也可以设置属性,属性一定是字符串格式
- 以每一个节点以<>开头,</>结尾,中间加内容
- 如果内容中有特殊的符号比如<>或者别的会产生错误的符号,就要
添加<![CDATA[[ ]]>,被这个符号括住的内容不会被解析为符号 - 节点名称有如下规则
1.名称可以含字母、数字以及其他的字符
2.名称不能以数字或者标点符号开始
3.名称不能以字符 “xml”(或者 XML、Xml)开始
4.名称不能包含空格,不能包含冒号(:)
5.名称区分大小写 - 注释:注释开始: < !-- 注释结束: – >
xml解析
有四种方式
1.SAX解析:逐行解析,需要的内存小,但是解析不能反回,解析一行以后,前面的都会销毁。
2.DOM解析:是全部加载完,加载成树状,然后解析,需要的内存大,但是解析需要的内容很方便,可以直接检索
3.JDOM解析:DOM的分支,是java特定模型比DOM多了几个功能
4.DOM4J解析:DOM的完善分支,在DOM的基础上增加了很多新方法,是目前用的最多的
DOM4J
- 引入jar文件 dom4j.jar
- 创建一个指向XML文件的输入流
FileInputStream fis = new FileInputStream(“xml文件的地址”); - 创建一个XML读取工具对象
SAXReader sr = new SAXReader(); - 使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
Document doc = sr.read(fis); - 通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement();
常用方法有
- public Element element( " 节点标记 ")返回的是方法调用者的第一个子节点
所有的节点类型都是Element - public String getText() 返回的是该节点的内容
- public void setText)作用是设置节点内容
- public List elements() 返回包含所有子节点的一个集合
- public String elementText( “子节点名称” ) 返回子节点的内容
- public String attributeValue(String 属性名称) 返回属性内容
- public String getName() 返回节点名称
- public Element addElement( " 子节点名称 " ) 增加一个子节点
9 public void addAttribute(String 属性名,String 属性值) 添加属性
示例
public class Dome4 {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
FileInputStream file = new FileInputStream("E://Book.xml");
SAXReader sax = new SAXReader();
Document doc = sax.read(file);
Element root = doc.getRootElement();
Element book = root.element("book");
System.out.println(book.elementText("name"));
}
}
DOM4J - XPATH解析XML
首先生成一个需要解析的doc文档,然后通过两个方法来查找相应的节点
方法1.
//根据路径表达式, 查找匹配的节点
Element e = selectSingleNode(“路径表达式”);
方法2.
List es = selectNodes(“路径表达式”);
路径表达式格式
- / : 从根节点开始查找
- // : 从发起查找的节点位置 查找后代节点 ***
- . : 查找当前节点
- … : 查找父节点
- @ : 选择属性. *
属性使用方式:
[@属性名=‘值’]
[@属性名>‘值’]
[@属性名<‘值’]
[@属性名!=‘值’]
常用的是//和[@属性名=‘值’]
示例
public class Demo5 {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
FileInputStream file = new FileInputStream("E://Book.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(file);
//如果查找单个节点,该节点又有很多同名节点,节点有属性的,就添加属性查找,没属性的话,只能查找第一个节点
Element book = (Element) doc.selectSingleNode("//book[@id='1']//book");
System.out.println(book.element("name").getText());
Element price = (Element) doc.selectSingleNode("//price");
System.out.println(price.getText());
}
}
如果要查找第二本或者第三本书的属性,就要用先获得第二本书,然后用element方法找到需要的属性,selectSingleNode和element方法一样,只能获得第一个节点。
用java生成xml格式数据
- 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
Document doc = DocumentHelper.createDocument(); - 通过文档对象, 向其中添加根节点
Element root = doc.addElement(“根节点名称”); - 通过根节点对象root , 丰富我们的子节点
Element e = root.addElement(“元素名称”); - 创建一个文件输出流 ,用于存储XML文件
FileOutputStream fos = new FileOutputStream(“要存储的位置”); - 将文件输出流, 转换为XML文档输出流
XMLWriter xw = new XMLWriter(fos); - 写出文档
xw.write(doc); - 释放资源
xw.close();
XStream生成xml
通过XStream快速将对象生成xml
- 创建XStream 对象
XStream x = new XStream(); - 修改类生成的节点名称 (默认节点名称为 包名.类名)
x.alias(“节点名称”,类名.class); - 传入对象 , 生成XML字符串
String xml字符串 = x.toXML(对象);
示例
public class Demo6 {
public static void main(String[] args) {
Book book = new Book("安徒生童话","丹麦作家写的童话故事","100元");
XStream x = new XStream();
x.alias("book",Book.class);
String xml = x.toXML(book);
System.out.println(xml);
}
}
<book>
<name>安徒生童话</name>
<info>丹麦作家写的童话故事</info>
<price>100元</price>
</book>
Process finished with exit code 0
JSON
java数据传输格式的重中之重。
JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式,格式简单传输和解析的效率比xml高很多。
格式
{
"name" : "安徒生童话" ,
"info" : "丹麦作家写的童话故事"
}
1.属性之间用,隔开
2.并且可以互相嵌套
3.[元素1,元素2…]
{
"name" : "安徒生童话" ,
"info" : "丹麦作家写的童话故事",
"story ":[ "皇帝的新装","卖火柴的小女孩"{
"info" : 讲述了一个小女孩在冬天买火柴的故事
} ],
"price" : "100元"
}
GSON
GSON是转换json格式的一个工具包
转换JSON字符串的步骤:
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
import com.google.gson.Gson;
public class Gjson {
public static void main(String[] args) {
Book book = new Book("安徒生童话","丹麦作家写的童话故事","123");
Gson g = new Gson();
String s = g.toJson(book);
System.out.println(s);
}
{"name":"安徒生童话","info":"丹麦作家写的童话故事","price":"123元"}
Process finished with exit code 0
将JSON对象转换为字符串
- 引入JAR包
- 在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
public class Gjson {
public static void main(String[] args) {
Gson g = new Gson();
//{"name":"安徒生童话","info":"丹麦作家写的童话故事","price":"123","list":["12","13","14"]}
Object book2= g.fromJson("{\"name\":\"安徒生童话\",\"info\":\"丹麦作家写的童话故事\",\"price\":\"123\",\"list\":[\"12\",\"13\",\"14\"]}",Object.class);
System.out.println(book2.toString());
}
如果没有指定特性的类的话(用Object),解析出来的是class com.google.gson.internal.LinkedTreeMap的对象
如果JSON格式的数据比转换的对象的属性多,那么多的部分会丢失
以下FastJson同理,多出来的部分属性会丢失
public class Gjson {
public static void main(String[] args) {
Gson g = new Gson();
//{"name":"安徒生童话","info":"丹麦作家写的童话故事","price":"123","list":["12","13","14"]}
Book book2= g.fromJson("{\"name\":\"安徒生童话\",\"info\":\"丹麦作家写的童话故事\",\"price\":\"123\",\"list\":[\"12\",\"13\",\"14\"]}",Book.class);
System.out.println(book2.toString());
}
}
Book{name='安徒生童话', info='丹麦作家写的童话故事', price='123'}
Process finished with exit code 0
FastJson
使用方式是导包,然后用JSON的三个方法进行互相转换,不需要创建FastJson对象。
public class Fast {
public static void main(String[] args) {
Book book = new Book("安徒生童话","丹麦作家写的童话故事","123元");
String s = JSON.toJSONString(book);
Book book1 = JSON.parseObject(s,Book.class);
List list = JSON.parseArray(s,List.class);
}
}
JSON.parseObject( 字符串类型的参数,类型.class),把json字符串转为相应的对象
JSON.parseArray(s,List.class),把json字符串转为相应的List集合
JSON.toJSONString(book),是把对象转为json字符串