首页 > 编程语言 >JAVA进阶--XML、XML解析、XPath、设计模式--2022年9月19日

JAVA进阶--XML、XML解析、XPath、设计模式--2022年9月19日

时间:2022-09-21 08:55:23浏览次数:77  
标签:XML -- 元素 contact println import 设计模式 public out

第一节

  1、XML是什么?

    XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言

    它是一种数据表示格式,可以用于自定义数据格式

    

  2、XML的作用是什么

    用于存储数据和传输数据

    作为软件的配置文件

  3、XML的组成格式要求是什么样的?

    文件后缀必须是xml

    文档声明必须是第一行

    必须存在一个根标签,有且只能有一个

    XML文件中可以定义注释信息:<!--  注释内容 -->

    标签必须成对出现,有开始,有结束标签:<name></name>

    必须能够正确的嵌套

    

 

     ===================================================================================================

    

 

     =============================================================

    

 

     ========================================================================================

    

  4、什么是文档约束

    

  5、XML的文档约束-DTD的作用和问题

    可以约束XML文件的编写

    不能约束具体的数据类型

  6、XML的文档约束-schema的优点?

    可以约束XML文件的标签内容格式,以及具体的数据类型

    本身也是xml文件,格式更严谨

    

  7、XML解析技术——Dom解析的文档对象模型是怎么样的

    Document对象:整个xml文档

    Element对象:标签

    Attribute对象:属性

    Text对象:文本内容

    

    

  8、XML解析技术——Dom解析常用技术框架

    Dom4j

  

 

   

 

  9、Dom4j解析XML文件

    

 

     

 1 package com.itheima.d1_dom4j;
 2 
 3 import org.dom4j.Attribute;
 4 import org.dom4j.Document;
 5 import org.dom4j.DocumentException;
 6 import org.dom4j.Element;
 7 import org.dom4j.io.SAXReader;
 8 import org.junit.Test;
 9 
10 import java.io.File;
11 import java.io.FileInputStream;
12 import java.io.InputStream;
13 import java.util.List;
14 
15 /**
16    目标:学会使用dom4j解析XML文件中的数据。
17     1、导入dom4j框架。
18     2、准备一个XML文件。
19  */
20 public class Dom4JHelloWorldDemo1 {
21     @Test
22     public void parseXMLData() throws Exception {
23         // 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架
24         SAXReader saxReader = new SAXReader();
25 
26         // 2、把XML文件加载到内存中成为一个Document文档对象
27         // Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); // 需要通过模块名去定位
28         // Document document = saxReader.read(new FileInputStream("xml-app\\src\\Contacts.xml"));
29 
30         // 注意: getResourceAsStream中的/是直接去src下寻找的文件
31         InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
32         Document document = saxReader.read(is);
33 
34         // 3、获取根元素对象
35         Element root = document.getRootElement();
36         System.out.println(root.getName());
37 
38         // 4、拿根元素下的全部子元素对象(一级)
39         // List<Element> sonEles =  root.elements();
40         List<Element> sonEles =  root.elements("contact");
41         for (Element sonEle : sonEles) {
42             System.out.println(sonEle.getName());
43         }
44 
45         // 拿某个子元素
46         Element userEle = root.element("user");
47         System.out.println(userEle.getName());
48 
49         // 默认提取第一个子元素对象 (Java语言。)
50         Element contact = root.element("contact");
51         // 获取子元素文本
52         System.out.println(contact.elementText("name"));
53         // 去掉前后空格
54         System.out.println(contact.elementTextTrim("name"));
55         // 获取当前元素下的子元素对象
56         Element email = contact.element("email");
57         System.out.println(email.getText());
58         // 去掉前后空格
59         System.out.println(email.getTextTrim());
60 
61         // 根据元素获取属性值
62         Attribute idAttr = contact.attribute("id");
63         System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
64         // 直接提取属性值
65         System.out.println(contact.attributeValue("id"));
66         System.out.println(contact.attributeValue("vip"));
67 
68 
69 
70 
71     }
72 }
View Code

  10、Dom4J的解析思想?

    得到文档对象Document,从中获取元素对象和内容

    

 1 package com.itheima.d1_dom4j;
 2 
 3 import org.dom4j.Attribute;
 4 import org.dom4j.Document;
 5 import org.dom4j.DocumentException;
 6 import org.dom4j.Element;
 7 import org.dom4j.io.SAXReader;
 8 import org.junit.Test;
 9 
10 import java.io.File;
11 import java.io.FileInputStream;
12 import java.io.InputStream;
13 import java.util.List;
14 
15 /**
16    目标:学会使用dom4j解析XML文件中的数据。
17     1、导入dom4j框架。
18     2、准备一个XML文件。
19  */
20 public class Dom4JHelloWorldDemo1 {
21     @Test
22     public void parseXMLData() throws Exception {
23         // 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架
24         SAXReader saxReader = new SAXReader();
25 
26         // 2、把XML文件加载到内存中成为一个Document文档对象
27         // Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); // 需要通过模块名去定位
28         // Document document = saxReader.read(new FileInputStream("xml-app\\src\\Contacts.xml"));
29 
30         // 注意: getResourceAsStream中的/是直接去src下寻找的文件
31         InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
32         Document document = saxReader.read(is);
33 
34         // 3、获取根元素对象
35         Element root = document.getRootElement();
36         System.out.println(root.getName());
37 
38         // 4、拿根元素下的全部子元素对象(一级)
39         // List<Element> sonEles =  root.elements();
40         List<Element> sonEles =  root.elements("contact");
41         for (Element sonEle : sonEles) {
42             System.out.println(sonEle.getName());
43         }
44 
45         // 拿某个子元素
46         Element userEle = root.element("user");
47         System.out.println(userEle.getName());
48 
49         // 默认提取第一个子元素对象 (Java语言。)
50         Element contact = root.element("contact");
51         // 获取子元素文本
52         System.out.println(contact.elementText("name"));
53         // 去掉前后空格
54         System.out.println(contact.elementTextTrim("name"));
55         // 获取当前元素下的子元素对象
56         Element email = contact.element("email");
57         System.out.println(email.getText());
58         // 去掉前后空格
59         System.out.println(email.getTextTrim());
60 
61         // 根据元素获取属性值
62         Attribute idAttr = contact.attribute("id");
63         System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
64         // 直接提取属性值
65         System.out.println(contact.attributeValue("id"));
66         System.out.println(contact.attributeValue("vip"));
67 
68 
69 
70 
71     }
72 }
View Code

  11、Dom4J解析后的数据形式

    通常数据会封装成Java的对象,如单个对象,或者集合对象形式

    

 1 package com.itheima.d1_dom4j;
 2 /**
 3  <contact id="1" vip="true">
 4  <name>   潘金莲  </name>
 5  <gender>女</gender>
 6  <email>[email protected]</email>
 7  </contact>
 8  */
 9 public class Contact {
10     private String name;
11     private int id;
12     private boolean vip;
13     private char gender;
14     private String email;
15 
16     public Contact() {
17     }
18 
19     public Contact(String name, int id, boolean vip, char gendar, String email) {
20         this.name = name;
21         this.id = id;
22         this.vip = vip;
23         this.gender = gendar;
24         this.email = email;
25     }
26 
27     public String getName() {
28         return name;
29     }
30 
31     public void setName(String name) {
32         this.name = name;
33     }
34 
35     public int getId() {
36         return id;
37     }
38 
39     public void setId(int id) {
40         this.id = id;
41     }
42 
43     public boolean isVip() {
44         return vip;
45     }
46 
47     public void setVip(boolean vip) {
48         this.vip = vip;
49     }
50 
51     public char getGender() {
52         return gender;
53     }
54 
55     public void setGender(char gender) {
56         this.gender = gender;
57     }
58 
59     public String getEmail() {
60         return email;
61     }
62 
63     public void setEmail(String email) {
64         this.email = email;
65     }
66 
67     @Override
68     public String toString() {
69         return "Contact{" +
70                 "name='" + name + '\'' +
71                 ", id=" + id +
72                 ", vip=" + vip +
73                 ", gendar=" + gender +
74                 ", email='" + email + '\'' +
75                 '}';
76     }
77 }
Contact
 1 package com.itheima.d1_dom4j;
 2 
 3 import org.dom4j.Document;
 4 import org.dom4j.Element;
 5 import org.dom4j.io.SAXReader;
 6 import org.junit.Test;
 7 
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 public class Dom4JTest2 {
12     @Test
13     public void parseToList() throws Exception {
14         // 需求:解析XML中的数据成为一个List集合对象。
15         // 1、导入框架(做过)
16         // 2、创建SaxReader对象
17         SAXReader saxReader = new SAXReader();
18         // 3、加载XML文件成为文档对象Document对象。
19         Document document =
20                 saxReader.read(Dom4JTest2.class.getResourceAsStream("/Contacts.xml"));
21         // 4、先拿根元素
22         Element root = document.getRootElement();
23         // 5、提取contact子元素
24         List<Element> contactEles = root.elements("contact");
25         // 6、准备一个ArrayList集合封装联系人信息
26         List<Contact> contacts = new ArrayList<>();
27         // 7、遍历Contact子元素
28         for (Element contactEle : contactEles) {
29             // 8、每个子元素都是一个联系人对象
30             Contact contact = new Contact();
31             contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
32             contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
33             contact.setName(contactEle.elementTextTrim("name"));
34             contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
35             contact.setEmail(contactEle.elementText("email"));
36             // 9、把联系人对象数据加入到List集合
37             contacts.add(contact);
38         }
39         // 10、遍历List集合
40         for (Contact contact : contacts) {
41             System.out.println(contact);
42         }
43     }
44 }
Dom4JTest2

  12、如果需要从XML文件中检索需要的某个信息(如name)怎么解决

      Dom4J需要进行文件的全部解析,然后再寻找数据

      Xpath技术更加适合做信息检索

  13、Xpath作用,四大类

    检索XML文件中的信息

    绝对路径:/根元素/子元素/孙元素

    相对路径:./子元素/孙元素

    全文检索://contact

    属性查找://@属性名、//元素[@属性名]、//元素//[@属性名=‘值’]

  

 

   ===================================================================

  

 

   ================================================================================================

  

 

   ============================

  

 

   

 

   

   

  1 package com.itheima.d2_xpath;
  2 import org.dom4j.Attribute;
  3 import org.dom4j.Document;
  4 import org.dom4j.Element;
  5 import org.dom4j.Node;
  6 import org.dom4j.io.SAXReader;
  7 import org.junit.Test;
  8 
  9 import java.util.List;
 10 
 11 /**
 12     目标:XPath检索XML中的信息啊。(了解)
 13 
 14     引入:
 15         Dom4J可以用于解析整个XML的数据。
 16         但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术)
 17         Dom4J用于解析数据,Xpath用于检索数据。
 18     XPath使用步骤:
 19         1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!)
 20         2.导入XPath独有的框架包。jaxen-1.1.2.jar
 21     XPath常用API:
 22         List<Node> selectNodes(String var1):检索出一批节点集合。
 23         Node selectSingleNode(String var1):检索出一个节点返回。
 24     XPath提供的四种检索数据的写法:
 25         1.绝对路径。
 26         2.相对路径。
 27         3.全文搜索。
 28         4.属性查找。
 29     小结:
 30          1.绝对路径: /根元素/子元素/子元素。
 31          2.相对路径: ./子元素/子元素。 (.代表了当前元素)
 32          3.全文搜索:
 33                 //元素  在全文找这个元素
 34                 //元素1/元素2  在全文找元素1下面的一级元素2
 35                 //元素1//元素2  在全文找元素1下面的全部元素2
 36          4.属性查找。
 37                 //@属性名称  在全文检索属性对象。
 38                 //元素[@属性名称]  在全文检索包含该属性的元素对象。
 39                 //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
 40  */
 41 public class XPathDemo {
 42     /**
 43      1.绝对路径: /根元素/子元素/子元素。
 44      */
 45     @Test
 46     public void parse01() throws Exception {
 47         // a、创建解析器对象
 48         SAXReader saxReader = new SAXReader();
 49         // b、把XML加载成Document文档对象
 50         Document document =
 51                 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
 52         // c、检索全部的名称
 53         List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
 54         for (Node nameNode : nameNodes) {
 55             Element  nameEle = (Element) nameNode;
 56             System.out.println(nameEle.getTextTrim());
 57         }
 58     }
 59 
 60     /**
 61      2.相对路径: ./子元素/子元素。 (.代表了当前元素)
 62      */
 63     @Test
 64     public void parse02() throws Exception {
 65         // a、创建解析器对象
 66         SAXReader saxReader = new SAXReader();
 67         // b、把XML加载成Document文档对象
 68         Document document =
 69                 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
 70         Element root = document.getRootElement();
 71         // c、检索全部的名称
 72         List<Node> nameNodes = root.selectNodes("./contact/name");
 73         for (Node nameNode : nameNodes) {
 74             Element  nameEle = (Element) nameNode;
 75             System.out.println(nameEle.getTextTrim());
 76         }
 77     }
 78 
 79     /**
 80      3.全文搜索:
 81      //元素  在全文找这个元素
 82      //元素1/元素2  在全文找元素1下面的一级元素2
 83      //元素1//元素2  在全文找元素1下面的全部元素2
 84      */
 85     @Test
 86     public void parse03() throws Exception {
 87         // a、创建解析器对象
 88         SAXReader saxReader = new SAXReader();
 89         // b、把XML加载成Document文档对象
 90         Document document =
 91                 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
 92         // c、检索数据
 93         //List<Node> nameNodes = document.selectNodes("//name");
 94         // List<Node> nameNodes = document.selectNodes("//contact/name");
 95         List<Node> nameNodes = document.selectNodes("//contact//name");
 96         for (Node nameNode : nameNodes) {
 97             Element  nameEle = (Element) nameNode;
 98             System.out.println(nameEle.getTextTrim());
 99         }
100     }
101 
102     /**
103      4.属性查找。
104      //@属性名称  在全文检索属性对象。
105      //元素[@属性名称]  在全文检索包含该属性的元素对象。
106      //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
107      */
108     @Test
109     public void parse04() throws Exception {
110         // a、创建解析器对象
111         SAXReader saxReader = new SAXReader();
112         // b、把XML加载成Document文档对象
113         Document document =
114                 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
115         // c、检索数据
116         List<Node> nodes = document.selectNodes("//@id");
117         for (Node node : nodes) {
118             Attribute attr = (Attribute) node;
119             System.out.println(attr.getName() + "===>" + attr.getValue());
120         }
121 
122         // 查询name元素(包含id属性的)
123 //      Node node = document.selectSingleNode("//name[@id]");
124         Node node = document.selectSingleNode("//name[@id=888]");
125         Element ele = (Element) node;
126         System.out.println(ele.getTextTrim());
127     }
128 }
XPathDemo

第二节   设计模式--工厂设计模式

  1、工厂设计模式的作用

    对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入

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

    

 1 package com.itheima.d3_factory_pattern;
 2 
 3 public abstract class Computer {
 4     private String name;
 5     private double price;
 6 
 7     public abstract void start();
 8 
 9     public String getName() {
10         return name;
11     }
12 
13     public void setName(String name) {
14         this.name = name;
15     }
16 
17     public double getPrice() {
18         return price;
19     }
20 
21     public void setPrice(double price) {
22         this.price = price;
23     }
24 }
Computer
1 package com.itheima.d3_factory_pattern;
2 
3 public class Huawei extends Computer{
4     @Override
5     public void start() {
6         System.out.println(getName() + "开机了,展示了华为的菊花图标~~~~");
7     }
8 }
Huawei
1 package com.itheima.d3_factory_pattern;
2 
3 public class Mac extends Computer{
4     @Override
5     public void start() {
6         System.out.println(getName() + "以非常优雅的方法启动了,展示了一个苹果logo");
7     }
8 }
Mac
 1 package com.itheima.d3_factory_pattern;
 2 
 3 public class FactoryPattern {
 4     /**
 5        定义一个方法,创建对象返回
 6      */
 7     public static Computer createComputer(String info){
 8         switch (info){
 9             case "huawei":
10                 Computer c = new Huawei();
11                 c.setName("huawei pro 16");
12                 c.setPrice(5999);
13                 return c;
14             case "mac":
15                 Computer c2 = new Mac();
16                 c2.setName("MacBook pro");
17                 c2.setPrice(11999);
18                 return c2;
19             default:
20                 return null;
21         }
22     }
23 }
FactoryPattern
 1 package com.itheima.d3_factory_pattern;
 2 
 3 
 4 /**
 5     目标:工厂模式。
 6 
 7     什么是工厂设计模式?
 8             工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。
 9             这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。
10             之前我们创建类对象时, 都是使用new 对象的形式创建, 除new 对象方式以外,
11             工厂模式也可以创建对象。
12 
13     工厂设计模式的作用:
14             1.对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。
15             2.可以实现类与类之间的解耦操作(核心思想,重点)
16 
17     小结:
18         工厂模式的思想是提供一个工厂方法返回对象!
19  */
20 public class FactoryDemo {
21     public static void main(String[] args) {
22         Computer c1 = FactoryPattern.createComputer("huawei");
23         c1.start();
24 
25         Computer c2 = FactoryPattern.createComputer("mac");
26         c2.start();
27     }
28 }
FactoryDemo

第三节   设计模式--装饰设计模式

  1、装饰设计模式的作用

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

    

1 package com.itheima.d4_decorator_pattern;
2 
3 /**
4    共同父类
5  */
6 public abstract class InputStream {
7     public abstract int read();
8     public abstract int read(byte[] buffer);
9 }
InputStream
 1 package com.itheima.d4_decorator_pattern;
 2 
 3 import java.util.Arrays;
 4 
 5 /**
 6    原始类
 7  */
 8 public class FileInputStream extends InputStream{
 9     @Override
10     public int read() {
11         System.out.println("低性能的方式读取了一个字节a");
12         return 97;
13     }
14 
15     @Override
16     public int read(byte[] buffer) {
17         buffer[0] = 97;
18         buffer[1] = 98;
19         buffer[2] = 99;
20         System.out.println("低性能的方式读取了一个字节数组:" + Arrays.toString(buffer));
21         return 3;
22     }
23 }
FileInputStream
 1 package com.itheima.d4_decorator_pattern;
 2 
 3 /**
 4    装饰类:继承InputStream 拓展原始类的功能
 5  */
 6 public class BufferedInputStream extends InputStream{
 7     private InputStream is;
 8     public BufferedInputStream(InputStream is){
 9         this.is = is;
10     }
11     @Override
12     public int read() {
13         System.out.println("提供8KB的缓冲区,提高读数据性能~~~~");
14         return is.read();
15     }
16 
17     @Override
18     public int read(byte[] buffer) {
19         System.out.println("提供8KB的缓冲区,提高读数据性能~~~~");
20         return is.read(buffer);
21     }
22 }
BufferedInputStream
 1 package com.itheima.d4_decorator_pattern;
 2 
 3 /**
 4   装饰模式
 5 
 6     定义父类:InputStream
 7     定义实现类:FileInputStream 继续父类 定义功能
 8     定义装饰实现类:BufferedInputStream 继承父类 定义功能 包装原始类,增强功能。
 9  */
10 public class DecoratorPattern {
11     public static void main(String[] args) {
12         InputStream is = new BufferedInputStream(new FileInputStream());
13         System.out.println(is.read());
14         System.out.println(is.read(new byte[3]));
15     }
16 }
View Code

标签:XML,--,元素,contact,println,import,设计模式,public,out
From: https://www.cnblogs.com/Flower--Dance/p/16708240.html

相关文章

  • WPF 使用 Win10 的 WinRT 自带 Windows.Media.Ocr 实现图片转文本
    世界上有很多OCR识别技术,本文来和大家介绍如果在WPF里,在运行到win10的设备上,通过WindowsRuntime自带的Windows.Media.Ocr实现在给定的图片里面识别文本的功能......
  • 并发原理 — CPU原子性指令(一)
    本篇文章将以IntelCPU作为讨论基础一、并发的由来一台计算机有2个cpu,其中CPU1执行程序A,CPU2执行程序B,由于程序A和程序B是两个不同的应用程序,所以它们两个之间并不存在......
  • WPF 用户控件,无法使用中文
    一、打开VS的高级保存选项1、工具——自定义——命令——菜单栏,下拉,选择文件。2、点击添加命令,左边类别,选择文件;右边命令,选择高级保存选项;确定。3、可以点击上移,下......
  • 数据类型
     typevarName[=value][{,varName[=value]}];//数据类型变量名=值 publicclass Demo02{  publicstaticvoidmain(String[]args){   ......
  • C#教程 - 程序集(Assembly)
    更新记录转载请注明出处:2022年9月21日发布。2022年9月10日从笔记迁移到博客。程序集(Assembly)说明运行在CLR上的版本化的、自描述的二进制文件Anassemblymaybe......
  • Codeforces 821 Div2
    T1:大小为n的数组,最多进行k次操作:下标模k意义下相等则可进行交换。求操作后连续k个元素的最大值固定最大值的k个连续因素小标为[0,k),现在只需使得它为最大即可,将可交换位......
  • C#教程 - 命名空间(Namespace)
    更新记录转载请注明出处:2022年9月21日发布。2022年9月10日从笔记迁移到博客。命名空间(Namespace)说明一串字符串,解决代码标识符命名重复问题作用:减少命名冲突、增......
  • 实验2:Open vSwitch虚拟交换机实践
    (一)基本要求a)/home/用户名/学号/lab2/目录下执行ovs-vsctlshow命令、以及p0和p1连通性测试的执行结果截图;b)/home/用户名/学号/lab2/目录下开启MininetCLI并执行pi......
  • HarmonyOS应用开发-声明式UI描述规范
    1.无构造参数配置组件的接口定义不包含必选构造参数,组件后面的“()”中不需要配置任何内容。示例:Column(){Text('item1')Divider()//Noparameterconfiguratio......
  • img和div之间有间隙的原因及解决方法
    div中存在img标签,由于img标签的display:inline-block属性。#####display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是因为我们在编辑器里写代码的......