XML,XML解析,设计模式

1.XML

概念:是一种数据格式

组成要求:

  1. 组成格式要求

    • 后缀是xml

    • 文档声明必须在第一行

      • <?xml version="1.0" encoding="UTF-8" ?>
    • 有且只有一个根标签

    • 可以定义注释

    • 标签必须成对出现

    • 必须能够正确嵌套

  2. <?xml version="1.0" encoding="UTF-8" ?> 
    <!--这是注释-->
     <Student> 
            <name>张三</name>
             <age>18</age>
         <adr>
             <code>10101</code>
             <name>花果山</name>
         </adr> 
         <sql>
             <![CDATA[ ]]>
         </sql>
     </Student>

 

2. XML文档的约束

  • DTD
  • XSD

3.Dom常见的解析对象

  • Document对象:整个xml文档

    • Element对象

    • Attribute对象

    • Text对象

1.dom4j解析XML文件(重点)

 @Test
    public void parseXMLtoList() throws Exception {
        //1.创建SAXReader解析对象,代表Dom4j框架
        SAXReader saxReader = new SAXReader();
        //2.推荐方案:读取字节输入流(默认认为/是直接去src下找的)
        Document document = saxReader.read(d3_dom4j快速入门.class.getResourceAsStream("demo1.xml"));
        //3.提取根元素
        Element root = document.getRootElement();
        //4.提取全部一级子元素
        List<Element> elements = root.elements();
        //5.定义一个ArrayList集合准备存储3个联系人对象信息
        List<Student> list = new ArrayList<>();
        //6.遍历每个元素
        for (Element element : elements) {
            Student student = new Student();
            student.setId(Integer.valueOf(element.attributeValue("id")));
            student.setVip(Boolean.valueOf(element.attributeValue("vip")));
            student.setName(element.elementText("name"));
            student.setAge(parseInt(element.elementTextTrim("age")));
            student.setSex(element.elementText("sex").charAt(0));
            student.setEmile(element.elementText("emile"));
            list.add(student);
        }
        for (Student student : list) {
            System.out.println(student);
        }
    }

2.使用Xpath检索出XML文件(重点)

1.绝对路径: 

//1.绝对路径:根元素/子元素/子元素
    @Test
    public void parse01() throws Exception {
        //a.创建解析器
        SAXReader saxReader = new SAXReader();
        //b.把XML文件加载成Document文档对象
        Document document =
                saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
        //c.直接检索
        List<Node> nodes = document.selectNodes("/students/student/name");
        for (Node node : nodes) {
            Element element = (Element) node;
            System.out.println(element.getTextTrim());
        }

2. 相对路径

//2.相对路径:./子元素/子元素(.代表了当前元素)
        //a.创建解析器
        SAXReader saxReader = new SAXReader();
        //b.把XML文件加载成Document文档对象
        Document document =
                saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
        Element root = document.getRootElement();
        //c.直接检索
        List<Node> nodes = root.selectNodes("./student/name");
        for (Node node : nodes) {
            Element element = (Element) node;
            System.out.println(element.getTextTrim());
        }

3.全文检索

 /**
         * 全文检索:
         * //元素: 在全文中找这个元素
         * //元素1/元素2 在全文中找到元素1下面的一级元素2
         * //元素1//元素2 在全文找元素1下面的全部元素2
         */
        //a.创建解析器
        SAXReader saxReader = new SAXReader();
        //b.把XML文件加载成Document文档对象
        Document document =
                saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
        //c.直接检索
        List<Node> nodes = document.selectNodes("//name");
        for (Node node : nodes) {
            Element element = (Element) node;
            System.out.println(element.getTextTrim());
        }

4.属性查找

 /**
         * 属性查找
         * //@属性名称 在全文中检索属性对象
         * //元素[@属性名称] 在全文中检索包含该属性的元素对象
         * //元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象
         */
        //a.创建解析器
        SAXReader saxReader = new SAXReader();
        //b.把XML文件加载成Document文档对象
        Document document =
                saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
        //c.直接检索
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
            Attribute attribute = (Attribute) node;
            System.out.println(attribute.getName() + "=" + attribute.getValue());
        }
        //检索元素的
        List<Node> nodes1 = document.selectNodes("//student[@id]");
        for (Node node : nodes1) {
            Element element = (Element) node;
            System.out.println(element.elementTextTrim("name"));
        }
        //检索元素
        Node nodes3 = document.selectSingleNode("//student[@id='1']");
        Element ele = (Element)nodes3;
        System.out.println(ele.elementTextTrim("name"));

 

4.工厂设计模式

  • 工厂设计模式是java最常用的设计模式之一,这种类型的设计模式属于创建型模式,他提供了一种获取对象的方式

  • 作用

    • 工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入

    • 可以实现类与类之间的解耦思想(核心)

5.装饰设计模式

  • 创建一个新类,包装原始类,从而在新类中提升原始类的功能

  • 作用

    • 装饰模式指的是在不改变原类的基础上,动态的扩展一个类的功能

//1.原始字节输入流
public class FileInputStream extends InputStream{
    @Override
    public int read() {
        return 97;
    }

    @Override
    public int read(byte[] buffer) {
        buffer[0]='a';
        buffer[1]='b';
        return 2;
    }

    @Override
    public void close() throws IOException {
        System.out.println("低级字节输入流被关闭~~");
    }
}

//2.装饰类增强原始字节输入流功能
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);
    }

    @Override
    public void close() throws IOException {
        is.close();
    }
}


//3.父类
public abstract class InputStream implements Closeable {
    public abstract int read();
    public abstract int read(byte[] buffer);
}

//4.实现
public static void main(String[] args) {
        //1.创建一个高级的缓冲字节输入流管道,包装低级的文件字节输入流管道
        BufferInputStream bis=new BufferInputStream(new FileInputStream());
       int bt= bis.read();
       System.out.println((char)bt);
       byte[] buffer=new byte[1024];
       int lens=bis.read(buffer);
       String re=new String(buffer,0,lens);
       System.out.println(re);

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值