【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"));
    }

设计模式

  • 工厂模式:对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入(可以实现类与类之间的解耦操作)
  • 装饰模式:创建一个新类,包装原始类,从而在新类中提升原来类的功能(在不改变原类的基础上,动态的扩展一个类的功能)
相关推荐
FreeBuf_9 分钟前
Apache组件遭大规模攻击:Tomcat与Camel高危RCE漏洞引发数千次利用尝试
java·tomcat·apache
无妄-202420 分钟前
软件架构升级中的“隐形地雷”:版本选型与依赖链风险
java·服务器·网络·经验分享
qqxhb25 分钟前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
猴哥源码1 小时前
基于Java+SpringBoot的在线小说阅读平台
java·spring boot
lingRJ7771 小时前
从混沌到掌控:基于OpenTelemetry与Prometheus构建分布式调用链监控告警体系
java·springboot·prometheus·backend·opentelemetry·jaeger·microservices
星辰离彬1 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
程序猿小D3 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
佛祖让我来巡山3 小时前
【工厂和策略设计模式妙用】解决接口选择与多重if-else 问题
设计模式·策略模式·工厂模式
转转技术团队3 小时前
二奢仓店的静默打印代理实现
java·后端
钢铁男儿4 小时前
C# 接口(什么是接口)
java·数据库·c#