二、Java框架基础02 XML

二、XML

2.1 XML 简介

XML 即可扩展标记语言,一种简单的数据存储语言,使用一系列简单的标记来描述结构化数据

XML 的特点

  • XML 与操作系统,编程语言的开发平台无关
  • 规范统一,实现不同系统之间的数据交互

2.1.1 XML 的文档结构

以下是 XML 代码描述图书的信息

<?xml version="1.0" encoding="UTF-8"?>
<books><book id="bk101"><title>.NET高级编程</title><author>王珊</author><description>包含C#框架和网络编程等</description></book><book id="bk102"><title>XML基础编程</title><author>李明明</author><description>包含XML基础概念和基本用法</description></book>
</books>
  • 通过以上代码来具体了解 XML 文档结构

2.1.2 XML 声明

  • <?xml version="1.0" encoding="UTF-8"?> 表示 XML 声明,用于标明这是一个 XML 文件
  • XML 声明主要有以下部分组成
    • version 文档符合 XML 1.0 规范
    • encoding 文档字符编码,默认为 UTF-8
  • 对于任何一个 XML 文档,都是固定格式

2.1.3 标签

  • XML 中,通过用尖括号 <> 括起来的各种标签来标记数据
  • 标签必须成对使用,必须有开始标签 <> 和 结束标签 </>
  • 标签之间是标签描述的内容
  • 例如 <author>王珊</author> 则表示作者信息

2.1.4 元素

  • XML 文档的主要部分是元素

  • 元素由开始标签、结束标签和元素内容注册

  • 元素内容指开始标签和结束标签之间的内容,可以包含子元素,字符数据等

  • 元素的命名规则如下

    • 名称中可以包含字母、数字或其他的字符
    • 名称不能以数字或标点符号开始
    • 名称不能以字符 xmlXML 等开始
    • 名称中不能包含空格
    • 元素允许是空元素,如 <title></title><title/>
  • 根元素

    • 每个 XML 文档必须有且仅有一个根元素,如 <books></books>
    • 根元素是一个完全包括文档中其他所有元素的元素
    • 根元素的起始标签要放在所有其他元素的起始标签之前
    • 根元素的结束标签要放在所有其他元素的结束标签之后
  • 属性

    • <book id="bk101"> 标签中使用 id 属性描述图书的编号信息
    • 属性的定义语法如下
    <元素名 属性名="属性值">
    
    • 属性值用双引号包裹
    • 一个元素可以有多个属性,多个属性之间用空格隔开
    • 元素中不能直接包含 <"&
    • 属性只能加在元素的起始标签上
  • XML 中的特殊字符的处理

    • 在 XML 中,有时在元素的文本中会涉及一些特殊字符 < > ' " &
    • 使用这些字符,需要用到 XML 中的预定义实体代替
    • XML 中的预定义实体和特殊字符的对应关系
    特殊字符实体名称
    <<
    >>
    &&amp;
    "&quot;
    &apos;
  • CDATA - (未解析)字符数据

    • 术语 CDATA 是不应该由 XML 解析器解析的文本数据。

    • <& 字符在 XML 元素中都是非法的。

    • < 会产生错误,因为解析器会把该字符解释为新元素的开始。

    • & 会产生错误,因为解析器会把该字符解释为字符实体的开始。

    • CDATA 部分中的所有内容都会被解析器忽略

  • CDATA 语法格式如下

    <![CDATA[要显示的字符]]>
    

2.2 解析 XML 概述

在实际应用当中,经常需要对 XML 文档进行各种操作

如在应用程序启动时去读取 XML 配置文件信息

或把数据库中的内容读取出来转为 XML 文档形式

这种情况就要运用到 XML 文档的解析技术

目前常用的 XML 解析技术有 4 种

2.2.1 DOM

  • DOM 是基于 XML 的树结构来完成解析的
  • DOM 解析 XML 文档时,会根据读取的文档,构建一个驻留内存的树结构
  • 使用 DOM API 可以操作这个树结构
  • 支持删除、修改、重新排列等多种功能
  • 但 DOM 解析同时也比较消耗资源

2.2.2 SAZ

  • SAZ 是基于事件的解析,为了解决 DMO 解析的资源消耗而出现的
  • SAZ 是通过事件处理器完成对文档的解析
  • SAZ 不用事先调入整个文档,所以它的优势就是占用资源少,内存消耗小
  • 在解析数据量较大的 XML 文档时会采用这种方式

2.2.3 JDOM

  • JDOM 是针对 Java 的特定文档模型
  • 它简化了与 XML 的交互并且币使用 DOM 更快
  • JDOM 仅使用具体类而不使用接口,在某方面简化了 API
  • 但是也限制了灵活性
  • API 大量使用了 Java 集合类型,对于属性这类的 Java 开发者而简化了使用

2.2.4 DOM4J

  • DOM4J 是一个非常优秀的 Java XML API
  • 具有性能优异、功能强大、易用的特点
  • DOM4J 用于在 Java 平台上使用 Java 集合框架处理 XML、XPath 和 XSLT
  • DOM4J 大量使用接口,面向接口编程使它币 JDOM 更加灵活

2.3 使用 DOM 读取 XML 数据

2.3.1 DOM 概念

  • DOM 即文档对象模型
  • DOM 把 XML 文件映射成一课倒挂的 “树”
  • 以根元素为根节点,每个节点都以对象形式存在
  • 通过存取这些对象就能存取 XML 文档的内容
  • 例如,创建文件 book.xml 并保存,book.xml 内容如下
<?xml version="1.0" encoding="UTF-8"?>
<book id="bk101"><title>三国演义</title><author>罗贯中</author><price>30元</price>
</book>
  • book.xml 对应的 DOM 树结构

image-20230722163108349

2.3.2 使用 DOM 读取手机收藏信息

  • 可以使用 JAXP 来解析 XML
  • JAXP 包含 3 个包,这 3 个包都在 JDK 中
    • org.w3c.dom:W3C 推荐的用于使用 DOM 解析 XML 文档的接口
    • org.xml.sax:用于使用 SAZ 解析 XML 文档的接口
    • javax.xml.parsers:解析其工厂工具,获得并配置特殊的解析器
  • 使用 DOM 解析 XML 时需要导入这些包中相关的类
  • JAXP 会把 XML 文档转换成一个 DOM 树
  • 使用 DOM 解析 XML 文档的步骤如下
    • 创建解析器工厂对象,即 DocumentBuilderFactory 对象
    • 由解析器工厂对象创建解析器对象,即 DocumentBuilder 对象
    • 由解析器对象对指定的 XML 文件进行解析,构建相应的 DOM 数,创建 Document 对象
    • 以 Document 对象为起点,对DOM 树的节点进行增加、删除、修改、查询等操作

2.3.3 使用 DOM 读取 XML 数据,使用 DOM 读取手机收藏信息中的品牌和型号信息 示例

XML 文档代码如下

<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo><Brand name="华为"><Type name="P90"/></Brand><Brand><Type name="iPhone Z"/><Type name="iPhone ZL"/></Brand>
</PhoneInfo>

手机收藏信息的 XML 文档对应的 DOM 树主要结构

image-20230722164954351

根据使用 DOM 解析 XML 的文档步骤,关键代码如下

package Test01;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;public class Test01 {public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {//得到 DOM 解析器的工厂实例DocumentBuilderFactory dbf=DocumentBuilderFactory.newDefaultInstance();//从 DOM 工厂获取 DOM 解析器DocumentBuilder db=dbf.newDocumentBuilder();//解析 XML 文档,等到一个 Document 对象,即DOM数//xml 文件位置,从 src包下开始Document doc= db.parse("src/main/java/Test01/收藏信息.xml");//等到所有的 Brand 节点列表信息NodeList brandList=doc.getElementsByTagName("Brand");//循环 Brand 信息for (int i=0; i<brandList.getLength();i++){//获取第 i 个 Brand 元素信息Node brand=brandList.item(i);//获取第 i 个 Brand 元素的 name属性Element element= (Element) brand;String attrValue=element.getAttribute("name");//获取第 i 个 Brand 元素的所有子元素的 name 属性值NodeList types=element.getChildNodes();for (int j = 0; j <types.getLength() ; j++) {Node node=types.item(j);if (node.getNodeType()==Node.ELEMENT_NODE){Element typeElement= ((Element) types.item(j));String type=typeElement.getAttribute("name");System.out.println("手机"+attrValue+type);}}}}
}

2.3.4 使用 DOM 解析 XML 时主要使用以下对象

Node 对象

  • Node 对象是 DOM 结构中的基本对象,代表了文档树中的一个抽象节点
  • Node 对象的主要方法如下
方法名说明
getChildNodes()返回包含此节点所有子节点 NodeList
getFirstChild()如果节点存在子节点,则返回第一个子节点
getLastChild()如果节点存在子节点,则返回最后一个子节点
getNextSibling()返回在 DOM 树中这个节点的下一个兄弟节点
getPreviousSibling()返回在 DOM 树中这个节点的上一个兄弟节点
getNodeName()返回节点的名称
getNodeValue()返回节点的值
getNodeType()返回节点的类型

NodeList 对象

  • NodeList 对象是指包含了一个或多个节点 (Node) 列表
  • 可以通过方法来获取列表中的元素
  • NodeList 对象的常用方法
方法名说明
getLength()返回列表长度
item(int idnex)返回指定位置的 Node 对象

Document 对象

  • Document 对象代表整个 XML 文档
  • 所有其他的 Node 都以一定的顺序包含在 Document 对象之内
  • 它是对 XML 文档进行操作的起点,先通过解析 XML 源文件获取 Document 对象然后来执行后续的操作
  • Document 对象的主要方法
方法名说明
getElementsByTagName(String name)返回一个 NodeList 对象,包含所有给定标签名的标签
getDocumentElement()返回一个代表这个 DOM 树的根节点的 Element 对象

Element 对象

  • Element 对象代表 XML了文档中的 标签元素
  • 在标签中可以包含属性,因而 Element 对象中也有存取属性的方法
  • Element 对象方法如下
方法名说明
getAttribute(String attributename)返回标签中给定属性名称的属性的值
getElementsByTagName(String name)返回具有给定标签名称的所有后代 Elements 的 NodeList

注意事项

  • XML 文档中的空白符也会被作为对象映射在 DOM 树中
  • 所以直接调用 Node 对象的 getChildNodes() 方法有时会出现一些问题
  • 解决方案如下
    • 使用 Element 的 getElementByTagName(String name),返回的 NodeList 对象就是所期待的对象
    • 调用 Node 的 getChildNodes() 方法得到 NodeList 对象,每次通过 item() 方法提取 Node 对象然后判断
    • 判断 node.getNodeType()==Node.ELEMENT_NODE 即判断是否为元素节点

2.4 使用 DOM4J 解析 XML

2.4.1 DOM4J API 概述

  • 使用 DOM4J 只要了解 XML-DOM 模型就能使用
  • DOM4J 主要接口都在 org.dom4j 这个包里定义
说明
Attribute定义了 XML 属性
Branch为能够包含子节点的节点,定义了一个公共行为
CDATA定义了 XML CDATA 区域
CharacterData是一个标识接口,标识基于字符的节点,如 CDATA、Comment 和 Text
Comment定义了 XML 注释的行为
Document定义了 XML 文档
DocumentType定义 XML DOCTYPE 声明
Element定义了 XML 元素
ElementHandler定义了 Element 对象的处理器
ElementPath被 ElementHandler 使用,用于取得当前正在处理的路径层次信息
Entity定义 XML 实体
Node为 dom4j 中所有的 XML 节点定义了多态行为
NodeFilter定义了在 dom4j 节点中产生的一个滤镜或谓词的行为
ProcessingInstruction定义 XML 处理指令
Text定义了 XML 文本节点
Visitor用于实现 Visitor 模式
XPath通过分析一个字符串提供一个 XPath 表达式
  • 使用这些需要提前导入一个 dom4j 的包
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version>
</dependency>

2.4.2 使用 DOM4J 操作 XML 数据

1、Document 对象相关

  • 读取 XML 文件,获得 Document 对象
SAXReader reader=new SAXReader();
Document document=reader.read(new File("input.xml"));

2、节点相关

  • 获得文档的根元素
Element rootElm=document.getRootElement();
  • 取得某节点的单个子节点
Element memberElm=rootElm.element("member"); //member 是节点名
  • 取得节点的文字
String text=emeberElm.getText();
//或者用下面这种方式
//取得根元素下的 name 子节点的文字
String text=rootElm.elementText("name");
  • 在某个节点下添加子节点,newMemberElm 是某个已存在的节点
Element ageElm=newMemberElm.addELment("age");
  • 设置文字节点
ageElm.setText("29");
  • 删除某节点
parentElm.remove(childElm);// childElm 是待删除的节点,parentElm是其父节点

3、属性相关

  • 取得某节点下的某属性
Element root=document.getRootElement();
Attribute attribute=toor.attribute("size"); //属性名 size
  • 取得属性的值
String text=attribute.getText();
//也可以使用
String text2=root.element("name").attributeValue("firstname");
  • 为某节点添加属性
newMemberElm.addAttribute("name","learningdom4j");
  • 设置属性的值
Attribute attribute=root.attribute("name");
attribute.setText("learningdom4j");
  • 删除某属性
Attribute attribute=root.attribute("size"); //属性名saize
root.remove(attribute)

e attribute=toor.attribute(“size”); //属性名 size


- 取得属性的值~~~java
String text=attribute.getText();
//也可以使用
String text2=root.element("name").attributeValue("firstname");
  • 为某节点添加属性
newMemberElm.addAttribute("name","learningdom4j");
  • 设置属性的值
Attribute attribute=root.attribute("name");
attribute.setText("learningdom4j");
  • 删除某属性
Attribute attribute=root.attribute("size"); //属性名saize
root.remove(attribute)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吐血整理,性能测试最重要指标分析说明,一步通关...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 QPS Queries Per …

swiper不生效/切换不生效,点击切换按钮activeIndex值不对应问题@令狐张豪

原因&#xff1a;因为把new Swiper放在mounted实例化的时候可能v-for并未执行完成结构还未完全生成 错误&#xff1a;先执行了swiper实例化后循环的&#xff1b;正确&#xff1a;先循环完数据确保数据完整循环完成后再执行swiper实例化&#xff1b; 解决方案&#xff1a;watch…

SketchUp 如何选择合适的硬件配置?

SketchUp 本地配置不足可以尝试云端解决方案&#xff1a; 渲云渲染插件 渲云云渲染面向多领域三维内容制作提供云渲染服务&#xff0c;帮助用户快速完成三维内容、动画及效果图的渲染计算&#xff0c;规避因本地电脑配置不足导致渲染慢的问题&#xff0c;大幅提高工作效率&…

注解和反射03--Class对象

注解和反射 Class类Class类的常用方法获取Class类的实例哪些类型可以有Class对象 Class类 在Object类重定义了以下的方法&#xff0c;此方法将被所有子类继承 public final Class getClass()以上的方法返回值的类型是一个Class类&#xff0c;此类是Java反射的源头&#xff0c…

一百三十七、Hive——HQL运行报错(持续更新中)

一、timestamp字段与int字段相加 &#xff08;一&#xff09;场景 change_time字段是timestamp字段&#xff0c;代表一个红绿灯周期的开始时间&#xff08;先是绿灯、再是黄灯、最后红灯&#xff09;&#xff0c;而green是int字段&#xff0c;代表绿灯的秒数&#xff0c;现在…

Docker 阿里云容器镜像服务

阿里云-容器镜像服务ACR 将本地/服务器docker image&#xff08;镜像&#xff09;推送到 阿里云容器镜像服务仓库 1. 在容器镜像服务ACR中创建个人实例 2. 进入个人实例 > 命名空间 创建命名空间 3. 进入个人实例 > 镜像仓库 创建镜像仓库 4. 进入镜像仓库 > 基本信…

论文笔记--Distilling the Knowledge in a Neural Network

论文笔记--Distilling the Knowledge in a Neural Network 1. 文章简介2. 文章概括3 文章重点技术3.1 Soft Target3.2 蒸馏Distillation 4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;Distilling the Knowledge in a Neural Network作者&#xff1a;Hinton, Geoffre…

【iOS】isKindOfClass和isMemberOfClass方法

前言 这个归根结底还是在考察我们对isa走向图和类的继承的理解&#xff0c;也就是苹果官方这幅图&#xff1a; 接下来的函数调用流程请参考这张图。 1 isKindOfClass方法 1.1 objc_opt_isKindOfClass C函数 查看源码可发现&#xff0c;无论是谁调用isKindOfClass方法都会…

flex布局进阶

推荐看一下阮一峰老师的flex布局博客【Flex 布局教程&#xff1a;语法篇】(https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html#)&#xff0c;讲的非常清晰。 一、多行布局大小相同的子盒子技巧 使用弹性布局实现多行均匀布局时&#xff0c;如若子盒子数量不能被每行…

HHDESK便捷功能介绍三

1 连接便捷显示 工作中&#xff0c;往往需要设置很多资源连接。而过多的连接设&#xff0c;往往很容易混淆。 在HHDESK中&#xff0c;当鼠标点击连接时&#xff0c;会在下方显示本连接的参数&#xff0c;方便用户查看。 2 日志查看 实际工作中&#xff0c;查看日志是一件很…

QT【day3】

思维导图&#xff1a; 闹钟&#xff1a; //widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> // #include<QTime> //定时器 #include<QDebug> // #in…

Rust vs Go:常用语法对比(七)

题图来自 Go vs Rust: Which will be the top pick in programming?[1] 121. UDP listen and read Listen UDP traffic on port p and read 1024 bytes into buffer b. 听端口p上的UDP流量&#xff0c;并将1024字节读入缓冲区b。 import ( "fmt" "net&qu…

API接口:如何通过使用手机归属地查询

随着手机普及率的不断增加&#xff0c;手机号码的信息查询也成为了一个非常实用的功能。本文将介绍如何通过使用手机归属地查询API接口实现查询手机号码所在地的功能。 首先&#xff0c;我们需要一个可以查询手机号码所在地的API接口。目前市面上有很多免费或付费的API接口可供…

深入了解HTTP代理在网络爬虫与SEO实践中的角色

随着互联网的不断发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;成为各大企业和网站重要的推广手段。然而&#xff0c;传统的SEO方法已经难以应对日益复杂和智能化的搜索引擎算法。在这样的背景下&#xff0c;HTTP代理爬虫作为一种重要的工具&#xff0c;正在逐渐被…

php-golang-rpc jsonrpc和php客户端tivoka/tivoka包实践

golang 代码&#xff1a; package main import ( "fmt" "net" "net/rpc" "net/rpc/jsonrpc" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg" Data any json:"…

【洁洁送书第二期】Python机器学习:基于PyTorch和Scikit-Learn

前言 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来&#xff0c;机器学习和深度学习迅猛发展&#xf…

clickhouse分布式查询降级为本地查询

在基于 clickhouse 做类数仓建模时通常的做法是在本地创建物化视图&#xff0c;然后使用分布式表做代理对外提供服务。我们知道 clickhouse 对于 DQL 内部实现了分布式&#xff0c;而对于 DDL 则需要我们自动实现比如&#xff1a; drop table table_name on cluster cluster_n…

TCP 协议【传输层协议】

文章目录 1. 简介1.1 TCP 协议是什么1.2 TCP 协议的作用1.3 什么是“面向连接” 2. 简述 TCP2.1 封装和解包2.2 TCP 报文格式2.3 什么是“面向字节流”2.4 通过 ACK 机制实现一定可靠性 3. 详述 TCP3.1 基本认识TCP 报头格式16 位源/目标端口号32 位序列号*32 位确认应答号4 位…

HCIA实验四

一.实验要求&#xff1a; 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4与其他所有直连设备间均使用共有IP&#xff1b; 2、R3 - R5/6/7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个网络配置OSPF环境&#xff0c;IP基于172.16.0.0/16网段划分&#x…

element中el-input组件限制输入条件(数字、特殊字符)

1、只能输入纯数字 <el-input v-model"aaa" type"text" input"(v)>(aaav.replace(/[^\d]/g,))" /> 2、只能输入纯数字和小数&#xff08;比如&#xff1a;6.66&#xff09; <el-input v-model"aaa" type"text&quo…