Day14、XML-设计模式等
XML
XML 概述
XML 是可扩展标记语言(eXtensible Markup Language) 的缩写, 它是是一种数据表示格式, 可以描述非常复杂的数据结构, 常用于传输和存储数据。
<?xml version="1.0" encoding="UTF-8"?>
<data >
<sender > 张三</sender >
<receiver > 李四</receiver >
<src >
<addr > 北京</addr >
<date > 2022-11-11 11:11:11 </date >
</src >
<current > 武汉</current >
<dest > 广州</dest >
</data >
XML 的几个特点和使用场景
一是纯文本, 默认使用UTF-8 编码; 二是可嵌套,
如果把XML 内容存为文件, 那么它就是一个XML 文件。
XML 的使用场景:XML 内容经常被当成消息进行网络传输, 或者作为配置文件用于存储系统的信息。
总结:
XML的创建
就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml
IDEA创建XML文件的操作步骤
XML的语法规则
XML文件的后缀名为:xml
文档声明必须是第一行
<?xml version="1.0" encoding="UTF-8" ?>
version:XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码
XML的标签(元素)规则
标签由一对尖括号和合法标识符组成: , 必须存在一个根标签, 有且只能有一个。
标签必须成对出现, 有开始, 有结束:
特殊的标签可以不成对, 但是必须有结束标记, 如:
标签中可以定义属性, 属性和标签名空格隔开, 属性值必须用引号引起来<
标签需要正确的嵌套
XML 的其他组成
XML 文件中可以定义注释信息:
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 < 18;
select * from user where age < 18 & & age > 10
<![CDATA[
select * from user where age < 18
]]>
</sql >
总结:
什么是文档约束
文档约束: 是用来限定xml文件中的标签以及属性应该怎么写。
以此强制约束程序员必须按照文档约束的规定来编写xml文件。
文档约束的分类
步骤 :XML文档约束 -DTD的使用
总结:XML的文档约束-DTD的作用和问题?
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA )>
<!ELEMENT 作者 (#PCDATA )>
<!ELEMENT 售价 (#PCDATA )>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd" >
<书架>
<书>
<书名>JAVAEE SSM</书名>
<作者>Newb</作者>
<售价>30</售价>
</书>
<书>
<书名>人鬼情未了</书名>
<作者>who</作者>
<售价>each</售价>
</书>
</书架>
文档约束-schema
schema 可以约束具体的数据类型, 约束能力上更强大。
schema 本身也是一个xml 文件, 本身也受到其他约束文件的要求, 所以编写的更加严谨
步骤:XML文档约束-schema的使用(了解)
总结:
XML的文档约束-schema的优点
可以约束XML文件的标签内容格式,以及具体的数据类型
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns ="http://www.w3.org/2001/XMLSchema"
targetNamespace ="http://www.itcsat.cn"
elementFormDefault ="qualified" >
<element name ='书架' >
<complexType >
<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 >
</schema >
XML解析技术
什么是XML解析
两种解析方式:
DOM常用的解析工具
DOM解析解析文档对象模型
总结:
步骤:使用DOM4j解析处XML文件
Dom4j 解析XML- 得到Document 对象
SAXReader 类
构造器
方法
public SAXReader()
创建Dom4J的解析器对象
Document read(String url)
加载XML 文件成为Document 对象
Document 类
说明
EIement getRootEIement()
获得根元素对象
public class Dom4JHelloWorldDemo01 {
@Test
public void parseXMLData () throws Exception {
SAXReader saxReader = new SAXReader ();
InputStream is = Dom4JHelloWorldDemo01.class.getResourceAsStream("/Contacts.xml" );
Document document = saxReader.read(is);
Element root = document.getRootElement();
System.out.println(root.getName());
}
}
Dom4j解析XML的元素、属性、文本
方法名
说明
List elements()
得到当前元素下所有子元素
List elements(String name)
得到当前元素下指定名字的子元素返回集合
EIement eIement(String name)
得到当前元素下指定名字的子元素, 如果有很多名字相同的返回第一
String getName()
得到元素名字
String attributeValue(String name)
通过属性名直接得到属性值
String elementText( 子元素名)
得到指定名称的子元素的文本
String getText()
得到文本
public class Dom4JHelloWorldDemo01 {
@Test
public void parseXMLData () throws Exception {
SAXReader saxReader = new SAXReader ();
InputStream is = Dom4JHelloWorldDemo01.class.getResourceAsStream("/Contacts.xml" );
Document document = saxReader.read(is);
Element root = document.getRootElement();
System.out.println(root.getName());
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 idAtter = contact.attribute("id" );
System.out.println(idAtter.getName() + "--->" + idAtter.getValue());
System.out.println(contact.attributeValue("id" ));
System.out.println(contact.attributeValue("vip" ));
Attribute idAtter1 = contact.attribute("vip" );
System.out.println(idAtter1.getName() + "--->" + idAtter1.getValue());
Element email = contact.element("email" );
System.out.println(email.getText());
}
}
总结:Dom4J的解析思想?
得到文档对象Document,从中获取元素对象和内容
案例:XML解析案例
public class Dom4jTest2 {
@Test
public void parseToList () throws Exception{
SAXReader saxReader = new SAXReader ();
Document document = saxReader.read(Dom4jTest2.class.getResourceAsStream("/Contacts.xml" ));
Element root = document.getRootElement();
List<Element> contactEles = root.elements("contact" );
ArrayList<Contact> contacts = new ArrayList <>();
for (Element contactEle : contactEles) {
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.elementTextTrim("email" ));
contacts.add(contact);
}
for (Contact contact : contacts) {
System.out.println(contact);
}
}
}
XML检索技术:Xpath
XPath 介绍
XPath 在解析XML 文档方面提供了一独树一帜的路径思想, 更加优雅, 高效
XPath 使用路径表达式来定位XML 文档中的元素节点或属性节点。
示例
步骤 :使用Xpath检索出XML文件
Xpath的四大检索方案
绝对路径-相对路径-全文检索-属性查找
public class XpathDemo {
@Test
public void parse01 () throws Exception{
SAXReader saxReader = new SAXReader ();
Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts2.xml" ));
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{
SAXReader saxReader = new SAXReader ();
Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts2.xml" ));
Element root = document.getRootElement();
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{
SAXReader saxReader = new SAXReader ();
Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts2.xml" ));
List<Node> nameNodes = document.selectNodes("//contact//name" );
for (Node nameNode : nameNodes) {
Element nameEle = (Element)nameNode;
System.out.println(nameEle.getTextTrim());
}
}
@Test
public void parse04 () throws Exception{
SAXReader saxReader = new SAXReader ();
Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts2.xml" ));
List<Node> nodes = document.selectNodes("//@id" );
for (Node node : nodes) {
Attribute attr = (Attribute) node;
System.out.println(attr.getName() + "-->" + attr.getValue());
}
Node node1 = document.selectSingleNode("//name[@id=888]" );
Element ele1 = (Element)node1;
System.out.println(ele1.getTextTrim());
}
}
总结:Xpath作用,四大类
检索XML 文件中的信息
绝对路径:/ 根元素/ 子元素/ 孙元素
相对路径: · / 子元素/ 孙元素
属性查找: //@属性名、/ / 元素[@属性名] 、/ / 元素[@属性名=值]
设计模式:工厂模式
什么是工厂设计模式?
之前我们创建类对象时, 都是使用new 对象的形式创建, 在很多业务场景下也提供了不直接new 的方式。
工厂模式( Factory Pattern ) 是Java 中最常用的设计模式之一, 这种类型的设计模式属于创建型模式, 它提供了一种获取对象的方式。
工厂设计模式的作用:
工厂的方法可以封装对象的创建细节, 比如: 为该对象进行加工和数据注入。
可以实现类与类之间的解耦操作( 核心思想) 。
总结:工厂设计模式的作用
对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入
可以实现类与类之间的解耦操作
设计模式:装饰模式
什么是装饰设计模式?
创建一个新类, 包装原始类, 从而在新类中提升原来类的功能。
装饰设计模式的作用:
作用: 装饰模式指的是在不改变原类的基础上, 动态地扩展一个类的功能。
lnputstream( 抽象父类)
FilelnputStream( 实现子类, 读写性能较差)
BufferedinputStream( 实现子类, 装饰类, 读写性能高)
定义父类。
定义原始类, 继承父类, 定义功能。
定义装饰类, 继承父类/ 包装原始类, 增强功能! !
后续
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!