Java XML XML解析,设计模式等

目录

 一.XML

        1.XML概述

        2.XML的创建、语法规则

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

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

二.XML解析技术

1.XML解析技术概述

2.Dom4J解析XML文件

3.Dom4J解析XML文件的各种节点

4.Dom4J解析XML文件-案例实战

三.XML检索技术:Xpath

四.设计模式:工厂模式

五.设计模式:装饰模式


 一.XML

        1.XML概述

 

 

        2.XML的创建、语法规则

 

 

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 这里是注释: 根标签有且仅能有一个-->
<student>
    <name>女儿国国王</name>
    <sex>女</sex>
    <hobby>唐僧,喜欢唐僧</hobby>
    <info>
        <age>30</age>
        <addr>女儿国</addr>
    </info>
    <sql>
        select * from user where age &lt; 18;
        select * from user where age &lt; 18 &amp;&amp; age > 10;

        <![CDATA[
        select * from user where age < 18;
        ]]>
    </sql>
</student>

 

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

 

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架>
    <书>
        <书名>Java从入门到入土</书名>
        <作者>iKun</作者>
        <售价>99</售价>
    </书>
    <书>
        <书名>Python从入门到入狱</书名>
        <作者>iKun</作者>
        <售价>59.5</售价>
    </书>
    <书>
        <书名>C++入门到放弃</书名>
        <作者>iKUN</作者>
        <售价>100</售价>
    </书>
</书架>

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

 

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.baidu.cn"
        elementFormDefault="qualified">
    <!--targetNamespace -> 声明约束文档的地址(命名空间)-->
    <element name='书架'>
        <!--写子元素-->
        <complexType>
            <!-- maxOccurs = 'unbounded':书架下的子元素可以有任意多个!-->
            <sequence maxOccurs="unbounded">
                <element name='书'>
                    <!--写子元素-->
                    <complexType>
                        <sequence>
                            <element name='书名' type='string' />
                            <element name='作者' type='string' />
                            <element name='售价' type='double' />
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns:书="http://www.baidu.cn"
    xmlns="http://www.w3.org/2001/XMLSchema"
    xsi:schemaLocation="http://www.baidu.com data.xsd">
    <书></书>

</书架>

二.XML解析技术

1.XML解析技术概述

 

 

 

2.Dom4J解析XML文件

 

package com.wjh.d1_dom4j;
/*
    目标:
        学会使用dom4j解析XML文件中的数据
        1.导入dom4j框架
        2.准备一个XML文件
 */


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.File;
import java.io.InputStream;

public class Dom4jDemo1 {

    @Test
    public void parseXMLDate() throws Exception {
        //1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();

        //2.把XML文件加载到内存中成为一个Document文档对象
        //Document document = saxReader.read(new File("D:\\JavaDemo\\JavaSEPro\\JavaSEProMax\\xml-app\\src\\Contacts.xml"));//需要通过模块名定位
        //Document document = saxReader.read(new File("D:\\JavaDemo\\JavaSEPro\\JavaSEProMax\\xml-app\\src\\Contacts.xml"));
        InputStream is = Dom4jDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

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


    }
}

3.Dom4J解析XML文件的各种节点

<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="1" vip="true">
        <name>潘金莲</name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
    <contact id="2" vip="false">
        <name>武松</name>
        <gender>男</gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3" vip="false ">
        <name>武大狼</name>
        <gender>男</gender>
        <email>wuda@itcast.cn</email>
    </contact>
    <user></user>
</contactList>

package com.wjh.d1_dom4j;
/*
    目标:
        学会使用dom4j解析XML文件中的数据
        1.导入dom4j框架
        2.准备一个XML文件
 */


import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.File;
import java.io.InputStream;
import java.util.List;

public class Dom4jDemo1 {

    @Test
    public void parseXMLDate() throws Exception {
        //1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();

        //2.把XML文件加载到内存中成为一个Document文档对象
        //Document document = saxReader.read(new File("D:\\JavaDemo\\JavaSEPro\\JavaSEProMax\\xml-app\\src\\Contacts.xml"));//需要通过模块名定位
        //Document document = saxReader.read(new File("D:\\JavaDemo\\JavaSEPro\\JavaSEProMax\\xml-app\\src\\Contacts.xml"));
        InputStream is = Dom4jDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

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

        //4.拿根元素下的全部子元素对象(一级)
        //List<Element> son = root.elements();
        List<Element> son = root.elements("contact");
        for (Element element : son) {
            System.out.println(element.getName());
        }

        //拿某个子元素
        Element userEle = root.element("user");
        System.out.println(userEle.getName());  //user

        //默认获取第一个子元素
        Element contact = root.element("contact");

        //获取子元素文本
        System.out.println(contact.elementText("name"));    //潘金莲

        //去掉前后空格
        System.out.println(contact.elementTextTrim("name"));    //潘金莲

        //根据元素获取属性值
        Attribute idAddress = contact.attribute("id");
        System.out.println(idAddress.getName() + "==>" + idAddress.getValue()); //id==>1

        //直接提取属性值
        System.out.println(contact.attributeValue("id"));       //1
        System.out.println(contact.attributeValue("vip"));      //true

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



    }
}

contactList
contact
contact
contact
user
潘金莲
潘金莲
id==>1
1
true
panpan@itcast.cn

进程已结束,退出代码为 0

4.Dom4J解析XML文件-案例实战

<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="1" vip="true">
        <name>潘金莲</name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
    <contact id="2" vip="false">
        <name>武松</name>
        <gender>男</gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3" vip="false ">
        <name>武大狼</name>
        <gender>男</gender>
        <email>wuda@itcast.cn</email>
    </contact>
    <user></user>
</contactList>
package com.wjh.d1_dom4j;
/*
    <contact id="1" vip="true">
        <name>潘金莲</name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
 */
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 + '\'' +
                '}';
    }
}

package com.wjh.d1_dom4j;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class Dom4jDemo2 {


    @Test
    public void parseXMLDate() throws Exception {
        //需求:解析XML中的数据成为一个List集合对象
        //1.导入框架(做过)
        //2.创建SaxReader对象
        SAXReader saxReader = new SAXReader();
        //3.加载XML文件成为文档对象Document对象.
        Document document = saxReader.read(Dom4jDemo2.class.getResourceAsStream("/Contacts.xml"));

        //4.先拿根元素
        Element root = document.getRootElement();

        //5.提取contact子元素
        List<Element> contactEles = root.elements("contact");

        //6.准备一个ArrasList集合封装联系人信息
        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.elementText("name"));
            contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
            contact.setEmail(contactEle.elementTextTrim("email"));

            //9.把联系人对象数据加入到List集合
            contacts.add(contact);
        }
        
        //10.遍历List集合
        for (Contact contact : contacts) {
            System.out.println(contact);
        }


    }
}

Contact{name='潘金莲', id=1, vip=true, gender=女, email='panpan@itcast.cn'}
Contact{name='武松', id=2, vip=false, gender=男, email='wusong@itcast.cn'}
Contact{name='武大狼', id=3, vip=false, gender=男, email='wuda@itcast.cn'}

进程已结束,退出代码为 0

三.XML检索技术:Xpath

 

 

 

 

 

 

<?xml version="1.0" encoding="UTF-8" ?>
<contactList>
    <contact id="1" vip="true">
        <name>潘金莲</name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
    <contact id="2" vip="false">
        <name>武松</name>
        <gender>男</gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3" vip="false">
        <name>武大狼</name>
        <gender>男</gender>
        <email>wuda@itcast.cn</email>
    </contact>
    <user>
        <contact>
            <info>
                <name id="888">我是西门庆</name>
            </info>
        </contact>
    </user>
</contactList>

package com.wjh.d2_xpath;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class XPathDemo1 {

    //绝对路径
    @Test
    public void parse01() throws Exception{
        //a.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b.把xml加载成Document文档对象
        Document document = saxReader.read(XPathDemo1.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());
        }
        /*
        潘金莲
        武松
        武大狼
         */
    }


    //相对路径
    @Test
    public void parse02() throws Exception{
        //a.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b.把xml加载成Document文档对象
        Document document = saxReader.read(XPathDemo1.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());
        }

        /*
        潘金莲
        武松
        武大狼
         */
    }

    //全文检索
    @Test
    public void parse03() throws Exception{
        //a.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b.把xml加载成Document文档对象
        Document document = saxReader.read(XPathDemo1.class.getResourceAsStream("/Contacts2.xml"));

        //c.检索数据
        List<Node> nameNodes = document.selectNodes("//name");
        for (Node nameNode : nameNodes) {
            Element nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
        /*
            潘金莲
            武松
            武大狼
            我是西门庆
         */
    }

    //属性查找
    @Test
    public void parse04() throws Exception{
        //a.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b.把xml加载成Document文档对象
        Document document = saxReader.read(XPathDemo1.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());
        }
        /*
        id===>1
        id===>2
        id===>3
        id===>888
         */
        //查询name元素(包含id属性的)
        Node node = document.selectSingleNode("//name[@id]");
        Element ele = (Element) node;
        System.out.println(ele.getTextTrim());

    }
}

潘金莲
武松
武大狼
潘金莲
武松
武大狼
潘金莲
武松
武大狼
我是西门庆
id===>1
id===>2
id===>3
id===>888
我是西门庆

进程已结束,退出代码为 0

 

四.设计模式:工厂模式

package com.wjh.d3_factory_pattern;

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

    public abstract void start();

    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;
    }
}
package com.wjh.d3_factory_pattern;

public class HuaWei extends Computer{
    @Override
    public void start() {
        System.out.println(getName() + "华为启动了");
    }
}
package com.wjh.d3_factory_pattern;

public class Mac extends Computer{


    @Override
    public void start() {
        System.out.println(getName() + "苹果启动");
    }
}
package com.wjh.d3_factory_pattern;

public class FactoryPattern {
    /**
     * 定义一个方法,创建对象返回
     */
    public static Computer creatComputer(String info){
        switch (info){
            case "huawei":
                Computer c = new HuaWei();
                c.setName("huawei pro 16");
                c.setPrice(99999);
                return c;

            case "mac":
                Computer c2 = new Mac();
                c2.setName("MAC mini 2");
                c2.setPrice(3699);
                return c2;
            default:
                return null;
        }
    }
}

package com.wjh.d3_factory_pattern;

import org.hamcrest.Factory;

public class FactoryDemo {
    public static void main(String[] args) {
//        Computer c = new Mac();
//        c.setName("苹果");
//        c.setPrice(9999);
//        c.start();

        Computer c1 = FactoryPattern.creatComputer("huawei");
        c1.start();

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


        
    }

}

huawei pro 16华为启动了
MAC mini 2苹果启动

进程已结束,退出代码为 0

五.设计模式:装饰模式

package com.wjh.d4_decorator_pattern;
/*
    原始类
 */

import java.util.Arrays;

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;
    }
}

package com.wjh.d4_decorator_pattern;

/**
 *  共同父类
 */
public abstract class InputStream {
    public abstract int read();
    public abstract int read(Byte[] buffer);

}

package com.wjh.d4_decorator_pattern;
/*
    装饰类: 继承InputStream 扩展原始类的功能
 */

public class BufferInputStream extends InputStream{
    private InputStream is;

    public BufferInputStream(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);
    }
}
package com.wjh.d4_decorator_pattern;
/*
    创建一个新类,包装原始类,从而在新类中提升原来类的功能。

装饰设计模式的作用:
作用:装饰模式指的是在不改变原类的基础上, 动态地扩展一个类的功能。

设计过程说明:

定义父类。
定义原始类,继承父类,定义功能。
定义装饰类,继承父类,包装原始类,增强功能!!
 */

public class Decorator {
    public static void main(String[] args) {
        InputStream is = new BufferInputStream(new FileInputStream());
        System.out.println(is.read());
        System.out.println(is.read(new Byte[3]));
        /*
            8KB缓冲区
            字节a
            97
            8KB缓冲区
            字节数组:[97, 98, 99]
            3
         */

    }
}

8KB缓冲区
字节a
97
8KB缓冲区
字节数组:[97, 98, 99]
3

进程已结束,退出代码为 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员希西子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值