JavaSE之XML
admin
2024-01-29 21:50:53
0次

目录

  • XML概念
  • XML的作用
    • XML约束介绍
    • XML的两种约束
  • XML的解析
    • 两种解析方式
  • dom4j解析XML
  • XPath介绍
  • 最后

XML概念

XML的全称为(eXtensible Markup Language),是一种可扩展的标记语言。

标记语言:通过标签来描述数据的一门语言

可扩展:标签的名字是可以自定义的

XML的作用

XML被设计用来存储和传输数据。

不同软件之间进行数据传输。

存储数据供软件使用。

XML组成-文档声明格式


version:版本号,该属性是必须存在的

encoding:文件编码,该属性不是必须的(一般取值都是UTF-8)

文档声明必须是XML第一行

注释


标签

cat

属性


实体字符

< 是 < ;>是> ;

1<22>1

字符数据区

快捷键:CD

1]]>

注意事项:

1.标签要成对出现,有前有后,后面的多一个斜杠

2.如果中间没有内容,可以在前面的标签上加上/表示提前结束这个标签

3.不要有嵌套标签

4.最外层只能有一个根标签

5.有些特殊字符需要转义,或者使用CD转义字符区标记

cat18
地球
1<22>11]]>

XML约束介绍

因为XML文件的标签和属性可以随意扩展,通过XML约束来限定XML文件中可使用的标签以及属性。

XML的两种约束

DTD约束,比较简单,功能相对弱

Schema,比较复杂,功能相对强

XML的解析

XML的解析就是读取XML中的数据

两种解析方式

SAX解析

DOM解析

DOM解析原理

一次性读取XML中的所有数据,在内存中形成一颗DOM树

dom4j解析XML

Person类

public class Person {private int id;private boolean vip;private String name;private String gender;private String email;public Person() {}public Person(int id, boolean vip, String name, String gender, String email) {this.id = id;this.vip = vip;this.name = name;this.gender = gender;this.email = email;}

将数据解析并存入List

// 我要经常得到XML的数据
// 1.每次都解析,效率低,代码很繁琐
// 2.解析一次,把得到的数据保存到对象中,以后只要获取对象中的数据
public class Demo01 {public static void main(String[] args) throws DocumentException {//创建一个List将解析得到的数据存入ArrayList arrayList = new ArrayList<>();// 1.创建解析器SAXReader sr = new SAXReader();// 2.使用解析器解析XML, 在内存中形成DOM树Document document = sr.read(new File("D:\\it_workspace\\JavaSE_进阶\\study_day14\\04_解析XML\\Contact.xml"));// getRootElement: 获取根元素Element rootElement = document.getRootElement();// getName(): 获取元素名称String name = rootElement.getName();System.out.println("根元素:" + name);// element(name): 获取一个指定名称的子元素,如果有多个返回第一个Element element1 = rootElement.element("contact");System.out.println("第一个:" + element1.getName());// attributeValue(属性名): 通过属性名得到属性值String id = element1.attributeValue("id");String vip = element1.attributeValue("vip");System.out.println(id + vip);// elements(): 获取所有子元素List elements = rootElement.elements();for (Element element : elements) {System.out.println(element.getName());System.out.println(element.attributeValue("id"));System.out.println(element.attributeValue("vip"));}System.out.println("--------------------");// elements(name): 获取所有指定名称的子元素List contacts = rootElement.elements("contact");for (Element contact : contacts) {System.out.println(contact.getName());String id1 = contact.attributeValue("id");String vip1 = contact.attributeValue("vip");System.out.println(id1 + vip1);// elementText(子元素): 得到子元素的文本String name1 = contact.elementText("name");String gender = contact.elementText("gender");String email = contact.elementText("email");System.out.println(id1 + vip1 + name1 + gender + email);//数据类型转换int i = Integer.parseInt(id1);boolean b = Boolean.parseBoolean(vip1);Person person = new Person(i, b, name1, gender, email);arrayList.add(person);}System.out.println("--------------------");for (Person person : arrayList) {System.out.println(person);}}
}

XPath介绍

XPath使用路径表达式来选取XML文档中的元素节点或属性节点。节点是通过沿着路

径 (path) 来选取的。XPath在解析XML文档方面提供了一独树一帜的路径思想。

XPath使用步骤

导入jar包(dom4j和jaxen-1.1.2.jar)

通过dom4j的SAXReader获取Document对象

利用XPath提供的API,结合XPath的语法完成选取XML文档元素节点进行解析操作。

public class Demo02 {public static Document document = null;//提前加载资源且只用加载一次所以用BeforeClass@BeforeClasspublic static void testBeforeClass() throws DocumentException {//dom4jSAXReader sr = new SAXReader();//junit里的相对路劲是不带模块名的//绝对路径绝不会错document = sr.read(new File("D:\\it_workspace\\JavaSE_进阶\\study_day14\\04_解析XML\\Contact.xml"));}// XPath:绝对路径@Testpublic void test01() {// 定义 XPath 表达式:/contactList/contact/name// 调用Document对象的selectNodes()方法执行XPath获得节点List nodes = document.selectNodes("/contactList/contact/name");for (Node node : nodes) {System.out.println(node.getName()+""+node.getText());}}// XPath:相对路径, 以调selectNodes方法用者作为参照往后找@Testpublic void test02() {// 获得根节点对象Element rootElement = document.getRootElement();// 定义 XPath 表达式:./contact/name// 调用Document对象的selectNodes()方法执行XPath获得节点List nodes = rootElement.selectNodes("./contact/name");for (Node node : nodes) {System.out.println(node.getName()+node.getText());}}// XPath:全文搜索@Testpublic void test03() {// 创建XPath表达式: //nameList nodes = document.selectNodes("//name");// 调用Document对象的selectNodes()方法执行XPath获得节点// List nodes = document.selectNodes("//name");for (Node node : nodes) {System.out.println(node.getName()+":"+node.getText());}}// XPath:属性查找   //@属性名 全文搜索属性,返回的是属性对象@Testpublic void test04() {// 创建XPath表达式: //@id 获取所有的id属性// 调用Document对象的selectNodes()方法执行XPath获得节点List nodes = document.selectNodes("//@id");for (Node node : nodes) {System.out.println(node.getName()+":"+node.getText());}}// XPath:属性查找   //元素[@属性名] 查找具有指定属性名的元素@Testpublic void test05() {// 创建XPath表达式: //contact[@vip] 获取包含vip属性的contact元素// 调用Document对象的selectNodes()方法执行XPath获得节点List nodes = document.selectNodes("//contact[@id='1']");for (Node node : nodes) {Element node1 = (Element) node;System.out.println(node1.elementText("name"));System.out.println(node.getName());}}
}

最后

如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。

相关内容

热门资讯

黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...
国际原油拉升,中曼石油涨超8%... 9月8日,油气开采及服务板块持续走高, 中曼石油(603619.SH)涨超8%, 石化油服(6008...
宁波银行启动2026年金融教育... 9月7日至13日,宁波银行开展2026年金融教育宣传周。此次活动紧扣“清朗金融网络 守护安心消费”主...
食物发芽后都有毒吗?哪些不能吃... 不少家庭囤放的食材放置一段时间后,悄悄长出了“小芽”。提到食物发芽,大多数人会认为“发芽的食物一般都...
3年9700万美元!骑士官宣与... 搜狐体育消息,北京时间9月9日,骑士官方今日宣布,球队已与哈登续签了一份多年期合同。 骑士官方写道...
农行工行定增2600亿 或于年... 记者 胡艳明 国有大行新一轮资本补充方案落地。 2026年9月7日,农业银行(下称“农行”)、工商银...
9月9日每日研选丨超强厄尔尼诺... 超强厄尔尼诺正成为近期农产品板块走强的核心推手。据美国国家海洋和大气管理局(NOAA)预测,2026...
巨头库存告急,美股光学网络携手... 当地时间9月8日,劳动节长假后的首个交易日,美股三大指数同步走低。标普500指数跌0.58%报767...
原创 A... 9月9日,新股市场迎来洛轴股份(301699)的上市交易。恐怕有些中签的股民已经等急了,因为在同一天...
早报美股光通信,逆市大涨;美袭... 宏观新闻 1、习近平同英国首相伯纳姆通电话。习近平祝贺伯纳姆就任英国首相,指出中英是全面战略伙伴,虽...
原创 “... 备受社会关注的“梅姨案”有了最新消息。9月8日下午,“梅姨”案被拐人申聪和父亲申军良及其代理律师面向...
哪些人群适合选择北方地区熏鸡加... 当前国内小成本餐饮赛道发展平稳,熟食类项目因客群覆盖广、投入门槛低、操作难度可控,成为不少创业者的选...
央视报道丨2026年服贸会首批... 央视《新闻联播》(2026年9月7日) 记者:张萍、叶奂 央视《朝闻天下》(2026年9月8日) 记...
原创 美... 近期,国际能源地缘格局迎来重大变动。 美国通过全新合作协议深度切入委内瑞拉石油产业,调整当地多年形成...
住院后突然糊涂?元凶不是年龄,... 住院后突然糊涂,真的是年纪大了么?很多人第一反应是把谵妄归因于年龄,但最近的一项权威研究给出一个更清...
消费新势力|山东省代表团参加第... 9月8日,第26届中国国际投资贸易洽谈会在福建厦门开幕,活动由商务部主办,是我国对外开放的重要窗口和...
消金公司半年考:头部缩表控险,... 来源:市场资讯 华夏时报记者 付乐 北京报道 近期,已开业的31家消费金融公司中,多家机构披露了2...
三星Q3大幅增加HBM4供应,... 每经编辑:肖芮冬 截至9时40分,市场震荡活跃,同指数费率最低标的科创芯片ETF(588290)跟踪...