admin 管理员组文章数量: 1086019
Java核心笔记
78、XML基础_Java解析XML
1.1、XML语法
1、声明:<?xml version="1.0" encoding="UTF-8"?>
2、根节点:必须只能有一个根节点
3、标签:标签必须有结束且区分大小写,标签必须顺序嵌套
4、属性:必须引号引起值
5、空格会被保留,HTML空格最多保留一个
6、命名规则:命名必须见名知意a)名字可包含字母、数字以及其他的字符 b)名字不能以数字或者标点符号开始 c)名字不能以字符“xml”(或者XML、Xml)开始
7、名字不能包含空格
8、 不应在 XML 元素名称中使用 ":" ,这是由于它用于命名空间(namespaces)的保留字。
9、标签优先于属性。
10、XML 命名空间可提供避免元素命名冲突的方法。
11、CDATA:字符数据,<![CDATA[字符数据]]> ,字符数据不进行转义 12、实体:&实体;
<?xml version='1.0' encoding='UTF-8' ?><!--文档声明 version='1.0'为必须字段--><users><!--根节点,有且只有一个根节点--><!-- 子节点,随便写,符合规则即可 --><user id='Z' number="zpark-001"><name>zhangsan</name><age>23</age><gender>nan</gender></user> <user id='L' number="zpark-002"><name>lisi</name><age>24</age><gender>nv</gender></user></users>
1.2、XML DTD 约束
DTD(DocType Definition 文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。用于约定XML格式。
1、DTD引用方式**
内部 <!DOCTYPE 根元素 [元素声明]>
1.3、XML Schema 约束
XML Schema 是基于 XML 的 DTD 替代者。XML Schema 描述 XML 文档的结构。XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。DTD不是通过XML语法定义文档结构, 不能定义数据类型和限制Schema通过XML语法定义文档结构,可以定义数据类型和限制
79、DOM解析器
DOM接口DOM定义了几个Java接口。这里是最常见的接口: 1、节点 - DOM的基本数据类型。2、元素 - 要处理的对象绝大多数是元素。3、Attr - 代表元素的属性。4、文本 - 元素或Attr的实际内容。5、文档 - 代表整个XML文档。文档对象是通常被称为DOM树。
常见的DOM方法 当正在使用DOM,有经常用到的几种方法: 1、Document.getDocumentElement() - 返回文档的根元素。 2、Node.getFirstChild() - 返回给定节点的第一个子节点。 3、Node.getLastChild() - 返回给定节点的最后一个子节点。 4、Node.getNextSibling() - 这些方法返回一个特定节点的下一个兄弟节点。
5、Node.getPreviousSibling() - 这些方法返回一个特定节点的前一个兄弟节点。
6、Node.getAttribute(attrName) - 对于给定的节点,则返回所请求的名字的属性。
2.2、Java DOM解析器 - 解析XML文档
使用DOM的步骤以下是在使用DOM解析器解析文档使用的步骤。
1、导入XML相关的软件包。
2、创建DocumentBuilder
3、从文件或流创建一个文档
4、提取根元素
5、检查属性
6、检查子元素
document对象:要操作XML,先就得有Document对象,把一个XML文件加载进内存的时候,在内存中形成所谓的一种树状结构,我们把这一个结构称之为DOM树.
80、解析示范
package com.zpark;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class DOMParseDemo {
public static void main(String[] args) throws Exception {
/*
1):表示出需要被操作的XML文件的路径,注意是文件的路径,不是文件所在的目录.
File f = new File(...);
2):根据DocumentBuilderFactory类,来获取DocumentBuilderFactory对象.
注意:工厂设计模式往往体现着单例设计模式.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
3):根据DocumentBuilderFactory对象,构建DocumentBuilder对象.
注意:XxxFactory,就是用来创建Xxx对象的.
DocumentBuilder build = factory .newDocumentBuilder();
4):根据DocumentBuidler对象,构建Document对象.
Document doc = build.parse(f);
*/
// 获取xml文件路径
String path = DOMParseDemo.class.getClassLoader().getResource("domDemo.xml").getPath();
// 由于路径中包含中文,所以需要对路径解析解码
path = URLDecoder.decode(path, "utf-8");
File file = new File(path);
// 获取DocumentBuilderFactory对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 根据DocumentBuilderFactory对象,构建DocumentBuilder对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 根据DocumentBuidler对象,构建Document对象
Document document = documentBuilder.parse(path);
// 获取给定标签名元素内容
NodeList student = document.getElementsByTagName("student");
for (int i = 0; i < student.getLength(); i++) {
// 获取节点对象
Node node = student.item(i);
// 将node转为element,node为element父接口
Element element = (Element)node;
// 根据标签名字获取标签的text值
String firstname = element.getElementsByTagName("firstname").item(0).getTextContent();
System.out.println(firstname);
}
}
}
81、工厂模式
package com.design_mode;
import com.design_mode.factory.Sender;
import com.design_mode.factory.impl.EmailSenderFactory;
import com.design_mode.factory.impl.SenderFactory01;
import com.design_mode.factory.impl.SenderFactory02;
import com.design_mode.factory.impl.SenderFactory03;
/**
* 工厂模式
* 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,
* 它提供了一种创建对象的最佳方式。
* 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
* 介绍
* 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
* 主要解决:主要解决接口选择的问题。
* 何时使用:我们明确地计划不同条件下创建不同实例时。
* 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
* 关键代码:创建过程在其子类执行。
* 注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有
* 一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成
* 创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
*/
public class FactoryTest01 {
public static void main(String[] args) {
/**
* 案例:发送信息(email, sms, 微信、qq...)
*/
// 实例化普通工厂对象
SenderFactory01 sf01 = new SenderFactory01();
// 生成指定对象
Sender email = sf01.product("email");
email.send();
// 生成微信对象
Sender weixin = sf01.product("weixin");
weixin.send();
// 实例化多工厂对象
SenderFactory02 sf02 = new SenderFactory02();
// 生成邮箱对象
Sender sender = sf02.productEmail();
sender.send();
// 实例化qq对象
Sender sender1 = SenderFactory03.productQQ();
sender1.send();
// 创建邮箱对象
EmailSenderFactory esf = new EmailSenderFactory();
Sender send = esf.provider();
send.send();
}
}
82、普通工厂、多工厂以及静态工厂
package com.design_mode;
import com.design_mode.factory.Sender;
import com.design_mode.factory.impl.EmailSenderFactory;
import com.design_mode.factory.impl.SenderFactory01;
import com.design_mode.factory.impl.SenderFactory02;
import com.design_mode.factory.impl.SenderFactory03;
/**
* 工厂模式
* 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,
* 它提供了一种创建对象的最佳方式。
* 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
* 介绍
* 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
* 主要解决:主要解决接口选择的问题。
* 何时使用:我们明确地计划不同条件下创建不同实例时。
* 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
* 关键代码:创建过程在其子类执行。
* 注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有
* 一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成
* 创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
*/
public class FactoryTest01 {
public static void main(String[] args) {
/**
* 案例:发送信息(email, sms, 微信、qq...)
*/
// 实例化普通工厂对象
SenderFactory01 sf01 = new SenderFactory01();
// 生成指定对象
Sender email = sf01.product("email");
email.send();
// 生成微信对象
Sender weixin = sf01.product("weixin");
weixin.send();
// 实例化多工厂对象package com.design_mode.factory.impl;
import com.design_mode.factory.Sender;
/**
* 普通工厂模式
*/
public class SenderFactory01 {
// 生成sender对象方法
public Sender product(String name){
// 判断需要生成的对象
if ("email".equals(name)) {
return new EmailSender();
} else if ("sms".equals(name)) {
return new SmsSender();
} else if ("weixin".equals(name)) {
return new WeChatSender();
} else if ("qq".equals(name)) {
return new QQSender();
} else {
throw new RuntimeException("无法生成" + name + "对象");
}
}
}
SenderFactory02 sf02 = new SenderFactory02();
// 生成邮箱对象
Sender sender = sf02.productEmail();
sender.send();
// 实例化qq对象
Sender sender1 = SenderFactory03.productQQ();
sender1.send();
// 创建邮箱对象
EmailSenderFactory esf = new EmailSenderFactory();
Sender send = esf.provider();
send.send();
}
}
package com.design_mode.factory.impl;
import com.design_mode.factory.Sender;
/**
* 多工厂模式
* 多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,
* 则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象
*/
public class SenderFactory02 {
// 生成邮箱对象工厂方法
public Sender productEmail(){
return new EmailSender();
}
// 生成短信对象工厂方法
public Sender productSms(){
return new SmsSender();
}
// 生成微信对象工厂方法
public Sender productWeChat(){
return new WeChatSender();
}
// 生成QQ对象工厂方法
public Sender productQQ(){
return new QQSender();
}
}
package com.design_mode.factory.impl;
import com.design_mode.factory.Sender;
/**
* 静态工厂模式
* 多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
*/
public class SenderFactory03 {
// 生成邮箱对象工厂方法
public static Sender productEmail(){
return new EmailSender();
}
// 生成短信对象工厂方法
public static Sender productSms(){
return new SmsSender();
}
// 生成微信对象工厂方法
public static Sender productWeChat(){
return new WeChatSender();
}
// 生成QQ对象工厂方法
public static Sender productQQ(){
return new QQSender();
}
}
83、邮箱工厂以及sms工厂
package com.design_mode.factory.impl;
import com.design_mode.factory.Provider;
import com.design_mode.factory.Sender;
/**
* 邮箱工厂类
*/
public class EmailSenderFactory implements Provider {
// 生成sender对象
@Override
public Sender provider() {
return new EmailSender();
}
}
package com.design_mode.factory.impl;
import com.design_mode.factory.Provider;
import com.design_mode.factory.Sender;
/**
* sms工厂类
*/
public class SmsSenderFactory implements Provider {
// 生成sender对象
@Override
public Sender provider() {
return new SmsSender();
}
}
本文标签: Java核心笔记
版权声明:本文标题:Java核心笔记 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1686559767a10291.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论