Loading

XML JSON

  • XML

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

XML用途

img

XML的文档结构

1.第一行必须是XML声明

<?xml version="1.0" encoding="UTF-8"?>
version 代表版本号1.0/1.1
encoding UTF-8设置字符集,用于支持中文

2.有且只有一个根节点

3.XML标签的书写规则与XML相同

特殊字符处理

标签体中,出现>,<,、特殊字符,会破坏文档结构

解决方案1 :使用实体引用。

img

解决方案 2:使用CDATA标签。

CDATA 指的是不应由 XML 解析器进行解析的文本数据

从""结束

<lesson>
    <content>
  <![CDATA[

        本节我们来学习html中 标签的使用:
          <body>
              <a href="index.html">首页</a>
          </body>
    ]]>

    </content>
</lesson> 

有序的子元素

img

XML语义约束

1.XML文档结构正确,但可能不是有效的

2.XML语义约束有两种定义方式DTD与XML Schema

DTD

文档类型定义(document type definition) 是一种简单易用的语义约束方式.

img

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解析

img

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基本表达式

img

img

img

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字符串

  

posted @ 2021-07-29 22:21  丨渍丨  阅读(89)  评论(0)    收藏  举报