JavaSE进阶(day14,复习自用)

XML、XML解析、设计模式等

  • XML
    • XML概述
    • XML的创建、语法规则
    • XML文档约束方式一-DTD约束[了解]
    • XML文档约束方式二-schema约束[了解]
  • XML解析技术
    • XML解析技术概述
    • Dom4J解析XML文件
    • Dom4J解析XML文件-案例实战
  • XML检索技术:Xpath
  • 设计模式:工厂模式
  • 设计模式:装饰模式

)

XML

XML概述

JavaSE进阶(day14,复习自用)_第1张图片XML是什么?
XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言。
它是是一种数据表示格式,可以用于自定义数据格式。
XML的作用是什么?
用于进行存储数据和传输数据
作为软件的配置文件

XML的创建、语法规则

JavaSE进阶(day14,复习自用)_第2张图片
JavaSE进阶(day14,复习自用)_第3张图片
JavaSE进阶(day14,复习自用)_第4张图片

XML文档约束方式一-DTD约束[了解]

文档约束:是用来限定xml文件中的标签以及属性应该怎么写。以此强制约束程序员必须按照文档约束的规定来编写xml文件。
JavaSE进阶(day14,复习自用)_第5张图片

XML文档约束方式二-schema约束[了解]

JavaSE进阶(day14,复习自用)_第6张图片

XML解析技术

XML解析技术概述

使用程序读取XML中的数据

两种解析方式
SAX解析
DOM解析
JavaSE进阶(day14,复习自用)_第7张图片
JavaSE进阶(day14,复习自用)_第8张图片

Dom4J解析XML文件

JavaSE进阶(day14,复习自用)_第9张图片
JavaSE进阶(day14,复习自用)_第10张图片

/*
    目标:学会使用dom4j解析XML文件中的数据。
    1.导入dom4k框架
    2.准备一个XML文件
 */
public class Dom4jHelloWorldDemo1 {
    @Test
    public void parseXMLData() throws Exception {
        //1.创建一个Dmo4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();
        //2.把XML文件加载到内存中成为一个Document文档对象
//        Document document = saxReader.read(new File("day14-xml-app/src/Contacts.xml"));//需要通过模块名去定位

        //注意:getResourceAsStream中的/是直接去src下寻找的文件
        InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        //3.获取根元素对象
        Element root = document.getRootElement();
        System.out.println(root.getName());

        //4.拿根元素下的全部子元素对象(一级)
//        List sonEles = root.elements();
        List<Element> sonEles = root.elements("contact");
        for (Element sonEle : sonEles) {
            System.out.println(sonEle.getName());
        }
        //拿某个子元素
        Element userEle = root.element("user");
        System.out.println(userEle.getName());
        //默认提取第一个子元素对象
        Element contact = root.element("contact");
        //获取子元素文本
        System.out.println(contact.elementText("name"));
        //去掉前后空格
        System.out.println(contact.elementTextTrim("name"));

        //根据元素获取属性值
        Attribute idAttr = contact.attribute("id");
        System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
        //直接提取属性值
        System.out.println(contact.attributeValue("id"));
        System.out.println(contact.attributeValue("vip"));


        //获取当前元素下的子元素对象
        Element email = contact.element("email");
        System.out.println(email.getText());



    }
}

Dom4J解析XML文件-案例实战

JavaSE进阶(day14,复习自用)_第11张图片


<contactList>
    <contact id="1" vip="true">
        <name>   潘金莲  name>
        <gender>gender>
        <email>[email protected]email>
    contact>
    <contact id="2" vip="false">
        <name>武松name>
        <gender>gender>
        <email>[email protected]email>
    contact>
    <contact id="3" vip="false">
        <name>武大狼name>
        <gender>gender>
        <email>[email protected]email>
    contact>
    <user>
    user>
contactList>
public class Contact {
    private String name;
    private int id;
    private boolean vip;
    private char gender;
    private String email;

    public Contact() {
    }

    public Contact(String name, int id, boolean vip, char gender, String email) {
        this.name = name;
        this.id = id;
        this.vip = vip;
        this.gender = gender;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public boolean isVip() {
        return vip;
    }

    public void setVip(boolean vip) {
        this.vip = vip;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Contact{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", vip=" + vip +
                ", gender=" + gender +
                ", email='" + email + '\'' +
                '}';
    }
}

public class Dom4jTest2 {

    @Test
    public void parseToList() throws Exception {
        //需求:解析XML中的数据成为一个List集合对象
        //1.导入框架(做过)

        //2.创建SaxReaader对象
        SAXReader saxReader = new SAXReader();
        //3.加载XML文件成为文档对象Document对象。
        Document document =
                saxReader.read(Dom4jTest2.class.getResourceAsStream("/Contacts.xml"));
        //4.先拿根元素
        Element root = document.getRootElement();
        //5.提取contact子元素
        List<Element> contactEles = root.elements("contact");
        //6.准备一个ArrayList集合封装联系人信息
        List<Contact> contacts = new ArrayList<>();
        //7.遍历Contact子元素
        for (Element contactEle : contactEles) {
            //8.每个子元素都是一个联系人对象
            Contact contact = new Contact();
            contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
            contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
            contact.setName(contactEle.elementTextTrim("name"));
            contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
            contact.setEmail(contactEle.elementText("email"));
            //9.把联系人对象数据加入到List集合
            contacts.add(contact);
        }
        //10.遍历List集合
        for (Contact contact : contacts) {
            System.out.println(contact);
        }


    }

}

XML检索技术:Xpath

JavaSE进阶(day14,复习自用)_第12张图片
JavaSE进阶(day14,复习自用)_第13张图片
JavaSE进阶(day14,复习自用)_第14张图片
JavaSE进阶(day14,复习自用)_第15张图片
JavaSE进阶(day14,复习自用)_第16张图片

/**
    目标:XPath检索XML中的信息啊。(了解)

    引入:
        Dom4J可以用于解析整个XML的数据。
        但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术)
        Dom4J用于解析数据,Xpath用于检索数据。
    XPath使用步骤:
        1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!)
        2.导入XPath独有的框架包。jaxen-1.1.2.jar
    XPath常用API:
        List selectNodes(String var1):检索出一批节点集合。
        Node selectSingleNode(String var1):检索出一个节点返回。
    XPath提供的四种检索数据的写法:
        1.绝对路径。
        2.相对路径。
        3.全文搜索。
        4.属性查找。
    小结:
         1.绝对路径: /根元素/子元素/子元素。
         2.相对路径: ./子元素/子元素。 (.代表了当前元素)
         3.全文搜索:
                //元素  在全文找这个元素
                //元素1/元素2  在全文找元素1下面的一级元素2
                //元素1//元素2  在全文找元素1下面的全部元素2
         4.属性查找。
                //@属性名称  在全文检索属性对象。
                //元素[@属性名称]  在全文检索包含该属性的元素对象。
                //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
 */
public class XPathDemo {
    /**
     1.绝对路径: /根元素/子元素/子元素。
     */
    @Test
    public void parse01() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索全部的名称
        List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     2.相对路径: ./子元素/子元素。 (.代表了当前元素)
     */
    @Test
    public void parse02() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        Element root = document.getRootElement();
        // c、检索全部的名称
        List<Node> nameNodes = root.selectNodes("./contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     3.全文搜索:
     //元素  在全文找这个元素
     //元素1/元素2  在全文找元素1下面的一级元素2
     //元素1//元素2  在全文找元素1下面的全部元素2
     */
    @Test
    public void parse03() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
//        List nameNodes = document.selectNodes("//name");
         List<Node> nameNodes = document.selectNodes("//contact/name");
//        List nameNodes = document.selectNodes("//contact//name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     4.属性查找。
     //@属性名称  在全文检索属性对象。
     //元素[@属性名称]  在全文检索包含该属性的元素对象。
     //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
     */
    @Test
    public void parse04() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
            Attribute attr = (Attribute) node;
            System.out.println(attr.getName() + "===>" + attr.getValue());
        }

        // 查询name元素(包含id属性的)
//      Node node = document.selectSingleNode("//name[@id]");
        Node node = document.selectSingleNode("//name[@id=888]");
        Element ele = (Element) node;
        System.out.println(ele.getTextTrim());
    }
}

设计模式:工厂模式

JavaSE进阶(day14,复习自用)_第17张图片

public abstract class Computer {
    private String name;
    private double price;

    public abstract void start();

    public Computer() {
    }

    public Computer(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

public class Huawei extends Computer{
    @Override
    public void start() {
        System.out.println(getName() + "开机了:展示了华为的菊花图标~");
    }
}
public class Mac extends Computer{

    @Override
    public void start() {
        System.out.println(getName() + "以非常优雅的方法启动了,展示了一个苹果logo");
    }
}
public class FactoryPattern {
    /*
        定义一个方法,创建对象返回
     */
    public static Computer createComputer(String info){
        switch (info){
            case "huawei":
                Computer c = new Huawei();
                c.setName("huawei pro 16");
                c.setPrice(5999);
                return c;
            case "mac":
                Computer c2 = new Mac();
                c2.setName("MacBook pro");
                c2.setPrice(11999);
                return c2;
            default:
                return null;

        }
    }


}

/**
 目标:工厂模式。

 什么是工厂设计模式?
 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。
 这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。
 之前我们创建类对象时, 都是使用new 对象的形式创建, 除new 对象方式以外,
 工厂模式也可以创建对象。

 工厂设计模式的作用:
 1.对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。
 2.可以实现类与类之间的解耦操作(核心思想,重点)

 小结:
 工厂模式的思想是提供一个工厂方法返回对象!
 */
public class FactoryDemo {
    public static void main(String[] args) {
        Computer c1 = FactoryPattern.createComputer("huawei");
        c1.start();

        Computer c2 = FactoryPattern.createComputer("mac");
        c2.start();

    }
}

设计模式:装饰模式

JavaSE进阶(day14,复习自用)_第18张图片

/*
    共同父类
 */
public abstract class InputStream {
    public abstract int read();
    public abstract int read(byte[] buffer);
}
/*
    原始类
 */
public class FileInputStream extends InputStream{
    @Override
    public int read() {
        System.out.println("低性能的方式读取了一个字节a");
        return 97;
    }

    @Override
    public int read(byte[] buffer) {
        buffer[0] = 97;
        buffer[1] = 98;
        buffer[2] = 99;
        System.out.println("低性能的方式读取了一个字节数组:"+ Arrays.toString(buffer));
        return 3;
    }
}
/*
    装饰类:继承InputStream 拓展原始类的功能
 */
public class BufferedInputStream extends InputStream{
    private InputStream is;
    public BufferedInputStream(InputStream is){
        this.is = is;
    }

    @Override
    public int read() {
        System.out.println("提供8KB的缓冲区,提高读写性能~~~");
        return is.read();
    }

    @Override
    public int read(byte[] buffer) {
        System.out.println("提供8KB的缓冲区,提高读写性能~~~");
        return is.read(buffer);
    }
}
/**
 装饰模式

 定义父类:InputStream
 定义实现类:FileInputStream 继续父类 定义功能
 定义装饰实现类:BufferedInputStream 继承父类 定义功能 包装原始类,增强功能。
 */
public class DecoratorPattern {
    public static void main(String[] args) {
        InputStream is = new BufferedInputStream(new FileInputStream());
        System.out.println(is.read());
        System.out.println(is.read(new byte[3]));


    }

}

你可能感兴趣的:(JavaSE进阶,java)