【JAVA】XML及其解析技术、XML检索技术、设计模式

XML

XML(Extensible Markup Language)是可扩展标记语言的缩写,它是一种数据表示格式,可以描述复杂的数据结构,常用于传输和存储数据

作用:

  • 用于进行存储数据和传输数据
  • 作为软件的配置文件

第一行是文档声明

*<?*xml version="1.0" encoding="UTF-8" ?>
version:XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码

特殊字符

&lt; < 小于
&gt; > 大于
&amp; & 和号
' ' 单引号
&quot; " 引号

注释

<!-注释内容-->

文档约束

限定xml文件中的标签和属性

  • DTD文档约束
  • schema文档约束(约束能力更强大)

XML解析

使用程序读取XML内容

常用的解析工具

|-------|-----------------------------------------------------------------------------------------------------|
| JAXP | SUN公司提供的一套XML的解析的API |
| JDOM | JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 |
| dom4j | 是JDOM的升级品,用来读写XML文件的。具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom 技术,同时它也是一个开放源代码的软件,Hibernate也用它来读写配置文件。 |
| jsoup | 功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便 |

dom4j解析XML元素

思想:得到文档对象document,从获取元素对象和内容

|---------------------------------------|---------------------------------|
| List<Element> elements() | 得到当前元素下所有子元素 |
| List<Element> elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
| Element element(String name) | 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个 |
| String getName() | 得到元素名字 |
| String attributeValue(String name) | 通过属性名直接得到属性值 |
| String elementText(子元素名) | 得到指定名称的子元素的文本 |
| String getText() | 得到文本 |

XML检索:Xpath

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

Xpath技术更适合做信息检索

绝对路径

|--------------|----------------------|
| /根元素/子元素/孙元素 | 从根元素开始,一级一级向下查找,不能跨级 |

java 复制代码
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> nodes = document.selectNodes("/contactList/contact/name");
        for (Node node : nodes) {
            Element nameEle = (Element) node;
            System.out.println(nameEle.getTextTrim());
        }
    }

相对路径

|-----------|-----------------------|
| ./子元素/孙元素 | 从当前元素开始,一级一级向下查找,不能跨级 |

java 复制代码
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> nodes = root.selectNodes("./contact/name");
        for (Node node : nodes) {
            Element nameEle = (Element) node;
            System.out.println(nameEle.getTextTrim());
        }
    }

全文搜索(直接全文搜索所有的name元素并打印)

|-----------------|----------------------------------------|
| //contact | 找contact元素,无论元素在哪里 |
| //contact/name | 找contact,无论在哪一级,但name一定是contact的子节点 |
| //contact//name | contact无论在哪一种,name只要是contact的子孙元素都可以找到 |

java 复制代码
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> nodes = document.selectNodes("//name");
        // List<Node> nodes = document.selectNodes("//contact/name");
        List<Node> nodes = document.selectNodes("//contact//name");
        for (Node node : nodes) {
            Element nameEle = (Element) node;
            System.out.println(nameEle.getTextTrim());
        }
    }

属性查找(在全文中搜索属性或带属性的元素)

|--------------------|-------------------------------|
| //@属性名 | 查找属性对象,无论是哪个元素,只要有这个属性即可。 |
| //元素[@属性名] | 查找元素对象,全文搜索指定元素名和属性名。 |
| //元素//[@属性名='值'] | 查找元素对象,全文搜索指定元素名和属性名,并且属性值相等。 |

java 复制代码
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 attribute = (Attribute) node;
            System.out.println(attribute.getName() + "=" + attribute.getValue());
        }

        // 检索元素的
        List<Node> nodes1 = document.selectNodes("//contact[@id]");
        for (Node node : nodes1) {
            Element nameEle = (Element) node;
            System.out.println(nameEle.elementTextTrim("name"));
        }

        // 检索元素
        Node node = document.selectSingleNode("//contact[@id='3']");
        Element conEle = (Element) node;
        System.out.println(conEle.elementTextTrim("name"));
    }

设计模式

  • 工厂模式:对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入(可以实现类与类之间的解耦操作)
  • 装饰模式:创建一个新类,包装原始类,从而在新类中提升原来类的功能(在不改变原类的基础上,动态的扩展一个类的功能)
相关推荐
Swift社区8 分钟前
Java 实战 - 字符编码问题解决方案
java·开发语言
灰灰勇闯IT8 分钟前
【Flutter for OpenHarmony--Dart 入门日记】第3篇:基础数据类型全解析——String、数字与布尔值
android·java·开发语言
tobias.b12 分钟前
408真题解析-2010-10-数据结构-快速排序
java·数据结构·算法·计算机考研·408真题解析
季明洵12 分钟前
力扣反转链表、两两交换链表中的节点、删除链表的倒数第N个节点
java·算法·leetcode·链表
猿小羽15 分钟前
Java 架构演进史:从咖啡杯到云原生霸主
java·云原生·架构
chilavert31815 分钟前
技术演进中的开发沉思-330 : 虚拟机命令行工具
java·jvm
Java程序员威哥17 分钟前
使用Java自动加载OpenCV来调用YOLO模型检测
java·开发语言·人工智能·python·opencv·yolo·c#
小北方城市网24 分钟前
Spring Cloud Gateway实战:路由、限流、熔断与鉴权全解析
java·spring boot·后端·spring·mybatis
ZealSinger30 分钟前
Nacos2.x 事件驱动架构:原理与实战
java·spring boot·spring·spring cloud·nacos·架构·事件驱动
独行soc1 小时前
2026年渗透测试面试题总结-7(题目+回答)
java·网络·python·安全·web安全·渗透测试·安全狮