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核心笔记