XML简介


实际开发中,不同语言项目之间的数据传递格式可能不兼容,为解决此问题,W3C组织推出一种数据交换标准——XML。它是一种通用的数据交换格式,可以使得数据在各种应用程序之间实现数据交换。
我们在某些业务场景下,存储数据或者传输数据给别人的时候,数据需要满足一定的规范进行组织(XML)。把XML文件中数据提取出来是(XML解析技术)。方便的在XML文件中进行数据的检索用(XPath)。

XML

(Extensible Markup Language)可扩展标记语言的缩写,它是一种数据表示形式,可以描述复杂的数据结构,常用于传输和存储数据。
(1)标签名可以随便取,允许标签嵌套
(2)纯文本,默认使用UTF-8编码
(3)如果把XML内容存为文件,那它就是一个XML文件,后缀名.xml
(4)XML内容当成消息进行网络传输或者作为配置文件用于存储系统的信息
在这里插入图片描述

XML的创建和语法规则

第一行必为文档声明,用来表示该文档是一个XML文档,以及遵循的XML版本规范。

<?xml [版本信息][编码信息][文档独立性信息]?> 
standalone="yes":声明该文档是否为独立文档。默认情况下为no,表示文档依赖于外部文档。

在这里插入图片描述
根标签:一个元素没有被嵌套在其他元素之中。
空标签:一个元素中没有子元素也没有文本内容。可以简写为

<img/>

(1)标签由一堆尖括号和合法标识符组成,必须只有一个根标签。
(2)标签必须成对出现,有出现,有结束。
(3)特殊的标签可以不重复,但是必须有结束标记。
(4)标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号括起来。

<student id="1">

(5)特殊字符:
在这里插入图片描述
XML文件中可以存在CDATA区: <![CDATA[ …内容… ]]>,在这里面可以不用写特殊字符的符号。

HTML和XML的不同点

xml用于传输数据,html用于格式化并且显示数据。还有一个常见版本——XHTML,是被XML重新定义过的html,是更加严格纯净的版本。

htmlxml
显示数据传输和存储数据
不区分大小写严格区分大小写
可以有多个根元素严格只有一个根元素
空格自动过滤空格不会删除
标记预定义标记需要自己定义

文档约束

限定xml文件中的标签和属性应该怎么写,以此强制约束程序员必须按照文档约束的规定编写xml文件。

DTD约束

在这里插入图片描述
步骤:
(1) 编写后缀为.dtd的文件
(2)在需要编写的XML文件中导入DTD约束文档。

<!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI">
//引用本地的DTD文件 URI是指相对于XML文档的相对路径,也可以是绝对路径
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">
//引用公共的DTD文件 它是Internet上的一个绝对的URL地址

(3)按照约束的规定编写XML文件的内容。

schema约束

在这里插入图片描述

①:编写schema约束文档,后缀必须是.xsd.
②:在需要编写的XML文件中导入该schema约束文档.
③:按照约束内容编写XML文件的标签。

XML解析技术

XML的数据作用:存储数据,做配置信息,进行数据传输+最终需要被程序进行读取,解析里面的信息。
在这里插入图片描述DOM常见的解析工具:
在这里插入图片描述在这里插入图片描述

Dom4J解析XML文件

在这里插入图片描述在这里插入图片描述

public class Dom4JHelloWorldDemo1 {
    @Test
    public void parseXMLData() throws Exception {
        // 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();

        // 2、把XML文件加载到内存中成为一个Document文档对象
        //Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); // 需要通过模块名去定位
        // Document document = saxReader.read(new FileInputStream("xml-app\\src\\Contacts.xml"));

        // 注意: 调用class中的getResourceAsStream中的   / .xml
        InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

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

Dom4j解析XML的元素、属性、文本的各种API:

在这里插入图片描述Dom4J的解析思想:得到文档对象Document,从中获取元素对象和内容。

XML检索技术:XPath

如何从XML文件中检索需要的某个信息(如name)?
(1)Dom4j需要进行文件的全部解析,然后再寻找数据。Dom4J用于解析数据,Xpath用于检索数据。
(2)Xpath技术更加适合做信息检索,使用路径表达式来定位XML文档中的元素节点或者属性节点。

/元素/子元素/孙元素
//子元素//孙元素

(3)使用步骤:
在这里插入图片描述(4)路径查找:

绝对路径:/根元素/子元素/孙元素(从根元素开始,一级一级向下寻找,不能跨级)

相对路径:先得到根节点contactList
再采用相对路径获取下一级contact 节点的name子节点并打印信息
./子元素/孙元素 从当前元素开始,一级一级向下查找,不能跨级

全文搜索
在这里插入图片描述
XPath:属性查找
在这里插入图片描述

public class XPathDemo {
    /**
     1.绝对路径: /根元素/子元素/子元素。
     */
    public void parse01() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索全部的名称
        List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     2.相对路径: ./子元素/子元素。 (.代表了当前元素)
     */
    public void parse02() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        Element root = document.getRootElement();
        // c、检索全部的名称
        List<Node> nameNodes = root.selectNodes("./contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     3.全文搜索:
     //元素  在全文找这个元素
     //元素1/元素2  在全文找元素1下面的一级元素2
     //元素1//元素2  在全文找元素1下面的全部元素2
     */
    public void parse03() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
        //List<Node> nameNodes = document.selectNodes("//name");
        // List<Node> nameNodes = document.selectNodes("//contact/name");
        List<Node> nameNodes = document.selectNodes("//contact//name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     4.属性查找。
     //@属性名称  在全文检索属性对象。
     //元素[@属性名称]  在全文检索包含该属性的元素对象。
     //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
     */

    public void parse04() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
            Attribute attr = (Attribute) node;
            System.out.println(attr.getName() + "===>" + attr.getValue());
        }

        // 查询name元素(包含id属性的)
//      Node node = document.selectSingleNode("//name[@id]");
        Node node = document.selectSingleNode("//name[@id=888]");
        Element ele = (Element) node;
        System.out.println(ele.getTextTrim());
    }
}

设计模式:工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一, 这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。

作用:工厂的方法可以封装对象的创建细节,如:为该对象进行加工和数据注入。可以实现类与类之间的解耦操作(核心思想)。

设计模式:装饰模式

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

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太一TT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值