Java学习-XML

1 XML

1.1 XML概述

  • XML是可扩展标记语言(eXtensible Markup Language) 的缩写,它是是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。

Java学习-XML_第1张图片

XML的几个特点和使用场景

  • 是纯文本,默认使用UTF-8编码;二是可嵌套;
  • 如果把XML内容存为文件,那么它就是一个XML文件。
  • XML的使用场景:XML内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统的信息。

1.2 XML的创建

  • 就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_ world.xml
     

XML的语法规则

  • XML文件的后缀名为: xml
  • 文档声明必须是第一行


version: XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码

 XML的标签(元素)规则

  • 标签由一对尖括号和合法标识符组成: ,必须存在一个根标签, 有且只能有一个。
  • 标签必须成对出现,有开始,有结束:
  • 特殊的标签可以不成对,但是必须有结束标记,如:
  • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
  • 标签需要正确的嵌套

XML的其他组成

  • XML文件中可以定义注释信息:
  • XML文件中可以存在以下特殊字符

Java学习-XML_第2张图片
●XML文件中可以存在CDATA区:
 

演示:



    孙悟空
    
    
        打妖精
    
    
        select * from where age < 19;
        
    

1.3 文档约束

什么是文档约束?

文档约束:是用来限定xml文件中的标签以及属性应该怎么写。

以此强制约束程序员必须按照文档约束的规定来编写xml文件。
文档约束的分类

  • DTD
  • schema

XML文档约束-DTD的使用( 了解)
需求:利用DTD文档约束,约束一一个XML文件的编写。
分析:
①:编写DTD约束文档,后缀必须是.dtd
Java学习-XML_第3张图片
②:在需要编写的XML文件中导入该DTD约束文档
③:按照约束的规定编写XML文件的内容。
 

文档约束-schema
●schema可 以约束具体的数据类型,约束能力上更强大。
●schema本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加严谨

2 XML解析技术

2.1 概述

XML的数据的作用是什么,最终需要怎么处理?

  • 存储数据、做配置信息、进行数据传输。
  • 最终需要被程序进行读取,解析里面的信息。
     

什么是XML解析
●使用程序读取XML中的数据
两种解析方式
●SAX解析
●DOM解析

Java学习-XML_第4张图片

2.2 解析文件

使用Dom4]解析出XML文件
需求:使用Dom4]把一个XML文件的数据进行解析
分析:
①下载Dom4j框架, 官网下载。
②在项目中创建一个文件夹: lib
③将dom4j-2.1.1 .jar文件复制到lib文件夹
④在jar文件上点右键,选择Add as Library->点击0K
⑤在类中导包使用

Dom4j解析XML-得到Document对象
SAXReader类
public SAXReader()创建Dom4J的解析器对象
Document read(String url)加载XML文件成为Document对象
Document类
Element getRootElement()获得根元素对象

Dom4j解析XML的元素、属性、文本
List< Element> elements()得到当前元素下所有子元素
List< Element> elements(String name)得到当前元素下指定名字的子元素返回集合
Element element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
String getName()得到元素名字
String attributeValue(String name)通过属性名直接得到属性值
String elementText(子元素名)得到指定名称的子元素的文本
String getText()得到文本

package com.itzw.d1_dom4j;

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.InputStream;
import java.util.List;

public class Dom4jTest01 {
    @Test
    public void parseXMLData() throws DocumentException {
        //1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();
        //2.把XML文件加载到内存中成为一个Document文档对象
        //getResourceAsStream直接去src目录下寻找文件
        InputStream is = Dom4jTest01.class.getResourceAsStream("/hello_xml.xml");
        Document document = saxReader.read(is);

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

        System.out.println("==============");
        //4.获取根元素的所有子元素对象
        List elements = root.elements();
        for (Element element : elements) {
            System.out.println(element.getName());
        }

        System.out.println("==============");
        //5.获取根元素的某个子元素对象
        Element name = root.element("name");
        System.out.println(name.getName());

        System.out.println("============");
        //6.获取子元素文本
        String name1 = root.elementText("name");
        System.out.println(name1);
        //这样也可以
        System.out.println(name.getText());

        System.out.println("=============");
        //7.根据元素获取属性值
        Element info = root.element("info");
        Attribute id = info.attribute("id");
        System.out.println(id.getName()+"-->"+id.getValue());


    }
}

2.3 案例

需求:利用Dom4J的知识,将Contact.xml文件中的联系人数据封装成List集合,其中每个元素是实体类Contact。打印输出List中的每个元素。

xml文件:



    
        潘金莲
        
        [email protected]
    
    
        武松
        
        [email protected]
    
    
        武大狼
        
        [email protected]
    

package com.itzw.d1_dom4j;

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.InputStream;
import java.util.List;

public class Dom4jTest01 {
    @Test
    public void parseXMLData() throws DocumentException {
        //1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();
        //2.把XML文件加载到内存中成为一个Document文档对象
        //getResourceAsStream直接去src目录下寻找文件
        InputStream is = Dom4jTest01.class.getResourceAsStream("/hello_xml.xml");
        Document document = saxReader.read(is);

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

        System.out.println("==============");
        //4.获取根元素的所有子元素对象
        List elements = root.elements();
        for (Element element : elements) {
            System.out.println(element.getName());
        }

        System.out.println("==============");
        //5.获取根元素的某个子元素对象
        Element name = root.element("name");
        System.out.println(name.getName());

        System.out.println("============");
        //6.获取子元素文本
        String name1 = root.elementText("name");
        System.out.println(name1);
        //这样也可以
        System.out.println(name.getText());

        System.out.println("=============");
        //7.根据元素获取属性值
        Element info = root.element("info");
        Attribute id = info.attribute("id");

        System.out.println(id.getName()+"-->"+id.getValue());


    }
}


3 XML检索技术:Xpath

3.1 概述

XPath在解析XML文档方 面提供了-独树一-帜的路径思想,更加优雅,高效
XPath使用路径表达式来定位XML文档中的元素节点或属性节点。

3.2 使用方法

使用Xpath检索出XML文件
需求:使用Dom4J把一个XML文件的数据进行解析
分析:
①导入jar包(dom4j和jaxen-1.1.2.jar), Xpath技术依赖Dom4j技术
②通过dom4j的SAXReader获取Document对象
③利用XPath提供的APl,结合XPath的语法完成选取XML文档元素节点进行解析操作。
④Document中与Xpath相关的API如下:

Node selectSingleNode("表达式")                获取符合表达式的唯一元素
List selectNodes("表达式")                获取符合表达式的元素集合

演示:

package com.itzw.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 XpathDemo {
    /**
     1.绝对路径:/根元素/子元素/子元素
     */

    @Test
    public void parse01() throws Exception{
        //a.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b.把XML加载成Document文档对象
        Document document =
                saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
        //c.检索全部的名称
        List 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("/Contacts.xml"));
        //c.检索全部的名称
        //List nameNodes = document.selectNodes("//name");
        //这里表示所有contact下的所有name
        List nameNodes = document.selectNodes("//contact//name");

        for (Node nameNode : nameNodes) {
            Element nameEle = (Element)nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     3.属性查找
     //元素[@属性名称]在全文检索包含该属性的元索对象。
     //元素[@属性名称=值]在全文检索包含该属性的元素且属性值为该值的元素对象。
     */
    @Test
    public void parse03() throws Exception{
        //a.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b.把XML加载成Document文档对象
        Document document =
                saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
        //c.检索全部的名称
        //List nameNodes = document.selectNodes("//name");
        //这里表示所有contact下的所有name
        List nodes = document.selectNodes("//@id");

        for (Node node : nodes) {
            Attribute attribute = (Attribute) node;
            System.out.println(attribute.getName()+"-->"+attribute.getValue());
        }
    }
}

 

4 工厂模式

什么是工厂设计模式?
●之前我们创建类对象时,都是使用new对象的形式创建,在很多业务场景下也提供了不直接new的方式。
●工厂模式(Factory Pattern)是Java中最常用的设计模式之- -,这种类型的设计模式属 于创建型模式,它提供了一种获取对象的方式。
工厂设计模式的作用:
●工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入。
●可以实现类与类之间的解耦操作( 核心思想)

5 装饰模式

什么是装饰设计模式?
●创建一个新类,包装原始类,从而在新类中提升原来类的功能。
装饰设计模式的作用:
●作用:装饰模式指的是在不改变原类的基础上,动态地扩展-个类的功能。

InputStream(抽象父类)
FileInputStream(实现子类,读写性能较差)
BufferedInputStream(实现子类,装饰类,读写性能高)

①定义父类。
②定义原始类,继承父类,定义功能。
③定义装饰类,继承父类,包装原始类,增强功能! !
 

你可能感兴趣的:(Java,java,学习,xml)