XML JSON
-
XML
XML的全称是EXtensible Markup Language,可扩展标记语言.
XML用途

XML的文档结构
1.第一行必须是XML声明
<?xml version="1.0" encoding="UTF-8"?>
version 代表版本号1.0/1.1
encoding UTF-8设置字符集,用于支持中文
2.有且只有一个根节点
3.XML标签的书写规则与XML相同
特殊字符处理
标签体中,出现>,<,、特殊字符,会破坏文档结构
解决方案1 :使用实体引用。

解决方案 2:使用CDATA标签。
CDATA 指的是不应由 XML 解析器进行解析的文本数据
从""结束
<lesson>
<content>
<![CDATA[
本节我们来学习html中 标签的使用:
<body>
<a href="index.html">首页</a>
</body>
]]>
</content>
</lesson>
有序的子元素

XML语义约束
1.XML文档结构正确,但可能不是有效的
2.XML语义约束有两种定义方式DTD与XML Schema
DTD
文档类型定义(document type definition) 是一种简单易用的语义约束方式.

DTD定义节点
标签1.定义emp节点下只允许出现 1个子节点
<!ELEMENT hr (employee)> 只允许出现 1个子节点
<!ELEMENT hr (employee+)> 最少出现一个子节点
<!ELEMENT hr (employee)*> 出现0到n个子节点
<!ELEMENT hr (employee)?> 最多出现一个子节点
2.employee节点下必须包含一下四个节点 ,且按顺序出现.
<!ELEMENT employee (name,age,salary,department)>
3.定义name标签体只能是文本,#PCDATA代表文本元素。
<!ELEMENT name (#PCDATA)>
XML引用DTD文件
.
<!DOCTYPE emp SYSTEM "a.dtd">
练习:
emp.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE emp SYSTEM "a.dtd">
<emp>
<employee num="666">
<name>li</name>
<age>18</age>
<salary>8000</salary>
<department>
<dname>人事</dname>
<address>xx大厦</address>
</department>
</employee>
<employee num="777">
<name>liu</name>
<age>22</age>
<salary>6000</salary>
<department>
<dname>财务</dname>
<address>xx大厦</address>
</department>
</employee>
<employee num="888">
<name>hou</name>
<age>33</age>
<salary>1500</salary>
<department>
<dname>后勤</dname>
<address>xx大厦</address>
</department>
</employee>
</emp>
a.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT emp (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee num CDATA "">
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
XML Schema
XML Schema比DTD更为复杂,提供了更多功能
XML Schema 提供了数据类型、格式限定、数据范围等特性
XML Schema 是W3C标准
<?xml version="1.0" encoding="UTF-8"?><!-- 人力资源管理系统 --><hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd"> <employee no="3309"> <name>张三</name> <age>31</age> <salary>4000</salary> <department> <dname>会计部</dname> <address>XX大厦-B103</address> </department> </employee> <employee no="3310"> <name>李四</name> <age>23</age> <salary>3000</salary> <department> <dname>工程部</dname> <address>XX大厦-B104</address> </department> </employee></hr><?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="hr"> <!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 --> <complexType> <sequence> <element name="employee" minOccurs="1" maxOccurs="9999"> <complexType> <sequence> <element name="name" type="string"></element> <element name="age"> <simpleType> <restriction base="integer"> <minInclusive value="18"></minInclusive> <maxInclusive value="60"></maxInclusive> </restriction> </simpleType> </element> <element name="salary" type="integer"></element> <element name="department"> <complexType> <sequence> <element name="dname" type="string"></element> <element name="address" type="string"></element> </sequence> </complexType> </element> </sequence> <attribute name="no" type="string" use="required"></attribute> </complexType> </element> </sequence> </complexType> </element> </schema>
XML解析

Dom4j
Dom4j是一个易用的、开源的库,用于解析XML。它应用于java平台,具有性能优异、功能强大和极其易使用的特点。
Dom4j将XML视为Document对象
XML标签被Dom4j定义为Element对象
遍历XML
import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import java.io.File;import java.util.List;public class EmpReader { public void readXml() { String file="E:\\emp.xml"; File file1=new File(file); SAXReader reader=new SAXReader(); try { Document document=reader.read(file1); //获取XMML文档根节点 Element root=document.getRootElement(); List<Element> employees= root.elements("employee"); for (Element employee : employees) { Element name=employee.element("name"); String empName=name.getText(); System.out.println(employee.elementText("salary")); Element department=employee.element("department"); System.out.println(department.elementText("dname")); System.out.println(department.elementText("address")); Attribute att=employee.attribute("num"); System.out.println(att.getText()); } } catch (DocumentException e) { e.printStackTrace(); } } public static void main(String[] args) { EmpReader empReader=new EmpReader(); empReader.readXml(); }}
更新XML
import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import java.io.*;import java.util.List;public class EmpWrite { public void writeXml() { String file="E:\\IdeaProjects\\web基础\\com.lr\\src\\emp.xml"; SAXReader reader=new SAXReader(); try { Document document=reader.read(file); //获取XMML文档根节点 Element root=document.getRootElement(); Element employee=root.addElement("employee"); employee.addAttribute("num","555"); Element name=employee.addElement("name"); name.setText("zxx"); employee.addElement("salary").setText("3600"); Element department=employee.addElement("department"); department.addElement("dename").setText("销售"); department.addElement("address").setText("xxx大厦"); Writer writer=new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); document.write(writer); writer.close(); } catch (DocumentException | FileNotFoundException | UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { EmpWrite empWrite=new EmpWrite(); empWrite.writeXml(); }}
XPath路径表达式
XPath路径表达式是XML 文档中查找数据的语言。
掌握XPath可以极大的提高在提取数据时的开发效率。
学习XPath本质就是掌握各种形式表达式的使用技巧。
XPath基本表达式



import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class XPathTestor { public void xpath(String xpathExp){ String file = "E:\\hr.xml"; File file1=new File(file); SAXReader reader = new SAXReader(); try { Document document = reader.read(file1); List<Node> nodes = document.selectNodes(xpathExp); for(Node node : nodes){ Element emp = (Element)node; System.out.println(emp.attributeValue("no")); System.out.println(emp.elementText("name")); System.out.println(emp.elementText("age")); System.out.println(emp.elementText("salary")); System.out.println("=============================="); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { XPathTestor testor = new XPathTestor();// testor.xpath("/hr/employee"); testor.xpath("//employee"); testor.xpath("//employee[salary<4000]"); testor.xpath("//employee[name='李铁柱']"); testor.xpath("//employee[@no=3304]"); testor.xpath("//employee[1]"); testor.xpath("//employee[last()]"); testor.xpath("//employee[position()<3]"); testor.xpath("//employee[3] | //employee[8]"); }}
JSON
json(Java Script Object Notation)JavaScript对象表示法
轻量级的文本数据交换格式
# JSON:
1. 概念: JavaScript Object Notation JavaScript对象表示法
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
var p = {"name":"张三","age":23,"gender":"男"};
* json现在多用于存储和交换文本信息的语法
* 进行数据的传输
* JSON 比 XML 更小、更快,更易解析。
2. 语法:
1. 基本规则
* 数据在名称/值对中:json数据是由键值对构成的
* 键用引号(单双都行)引起来,也可以不使用引号
* 值得取值类型:
1. 数字(整数或浮点数)
2. 字符串(在双引号中)
3. 逻辑值(true 或 false)
4. 数组(在方括号中) {"persons":[{},{}]}
5. 对象(在花括号中) {"address":{"province":"陕西"....}}
6. null
* 数据由逗号分隔:多个键值对由逗号分隔
* 花括号保存对象:使用{}定义json 格式
* 方括号保存数组:[]
2. 获取数据:
1. json对象.键名
2. json对象["键名"]
3. 数组对象[索引]
4. 遍历
//1.定义基本格式 var person = {"name": "张三", age: 23, 'gender': true}; var ps = [{"name": "张三", "age": 23, "gender": true}, {"name": "李四", "age": 24, "gender": true}, {"name": "王五", "age": 25, "gender": false}]; //获取person对象中所有的键和值 //for in 循环 /* for(var key in person){ //这样的方式获取不行。因为相当于 person."name" //alert(key + ":" + person.key); alert(key+":"+person[key]); }*/ //获取ps中的所有值 for (var i = 0; i < ps.length; i++) { var p = ps[i]; for(var key in p){ alert(key+":"+p[key]); } }
3. JSON数据和Java对象的相互转换
* JSON解析器:
* 常见的解析器:Jsonlib,Gson,fastjson,jackson
1. JSON转为Java对象
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
\3. 调用ObjectMapper的相关方法进行转换
1. readValue(json字符串数据,Class)
2. Java对象转换JSON
1. 使用步骤:
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
3. 调用ObjectMapper的相关方法进行转换
1. 转换方法:
* writeValue(参数1,obj):
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
* writeValueAsString(obj):将对象转为json字符串
2. 注解:
1. @JsonIgnore:排除属性。
2. @JsonFormat:属性值得格式化
* @JsonFormat(pattern = "yyyy-MM-dd")
3. 复杂java对象转换
1. List:数组
2. Map:对象格式一致
# 案例:
* 校验用户名是否存在
\1. 服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
1. $.get(type):将最后一个参数type指定为"json"
2. 在服务器端设置MIME类型
response.setContentType("application/json;charset=utf-8");
语法规则:
{"sites": [{ "name":"" , "url":"www.imooc.com" },慕课网{ "name":"" , "url":"www.baidu.com" },百度{ "name":"" , "url":"www.163.com" }网易]}
数据有键(key)值(value)描述,有逗号隔开
[]数组,多个对象之间用逗号隔开
{}代表一个完整对象,拥有多个键值对
[ { "empno": 7369, "ename": "李宁", "job": "软件工程师", "hiredate": "2017-05-12", "salary": 13000, "dname": "研发部" }, { "empno": 7499, "ename": "王乐", "job": "客户经理", "hiredate": "2017-04-22", "salary": 10000, "dname": "市场部", "customers": [ { "cname": "李东" }, { "cname": "刘楠" } ] }]
JavaScript交互json
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><script type="text/javascript"> var json = [ { "empno": 7369, "ename": "李宁", "job": "软件工程师", "hiredate": "2017-05-12", "salary": 13000, "dname": "研发部" }, { "empno": 7499, "ename": "王乐", "job": "客户经理", "hiredate": "2017-04-22", "salary": 10000, "dname": "市场部", "customers": [ { "cname": "李东" }, { "cname": "刘楠" } ] } ]; //在浏览器控制台中对json内容进行输出 console.log(json); for(var i = 0 ; i < json.length ; i++){ var emp = json[i]; document.write("<h1>"); document.write(emp.empno); document.write("," + emp.ename); document.write("," + emp.job); document.write("," + emp.hiredate); document.write("," + emp.salary); document.write("," + emp.dname); document.write("</h1>"); if(emp.customers != null){ document.write("<h2>---") for(var j = 0 ; j < emp.customers.length ; j++){ var customer = emp.customers[j]; document.write(customer.cname + ",") } document.write("</h2>") } } JS字符串转为JSON
JSON对象转为JS字符串

浙公网安备 33010602011771号