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());}}
}

最后

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

相关内容

热门资讯

金价会重现2011年暴跌及熊市... 2025年至2026年初,国际金价迎来一波规模空前的上行走势,国际金价自每盎司2500美元/盎司附近...
中国何时做出最强大模型?马斯克... (文/陈济深 编辑/张广凯) 今日,有网友在社交媒体提问称:“中国大模型预计何时能够达到Anthro...
落马市委书记留下33个烂尾工程... 6月18日,最高人民法院发布依法惩治渎职犯罪典型案例,其中提到曹某受贿、滥用职权一案。 据披露,2...
攻击217款银行应用:安卓木马... IT之家 6 月 19 日消息,安全公司 Zimperium 于 6 月 17 日发布博文,报告称其...
原创 免... 编辑 | 虞尔湖 出品 | 于见专栏 微短剧行业在2025年迈过了千亿规模门槛,全年3.3万部新剧...
奥克股份:独立董事任建纲辞任 奥克股份:独立董事任建纲辞任 每经AI快讯,6月18日,奥克股份公告,公司董事会近日收到独立董事任建...
2万亿存款“大迁徙”:当利率“... 一场由低利率和资产比价驱动的财富迁移正在发生,2万亿居民存款在两个月内“搬家”,寻找新的“避风港”。...
马化腾身家暴涨千亿,稳居大湾区... 6月17日,新财富杂志发布2026年中国创富榜500强榜单。榜单显示,以持股市值计算的上榜者总财富达...
大搜车冲刺纳斯达克:拟6月25... 雷递网 雷建平 6月18日 大搜车(DSC Holding,股票代码为:“DSC”)日前开启招股,准...
原创 美... 如果把全球能源市场比作一张大牌桌,那么这一轮中东风暴里最让西方分析师抓狂的,不是哪家产油国突然减产,...
董事长不能兼任集体委主任 股份合作公司在深圳城市发展过程中起到了重要作用,烟火气息浓厚。 南都记者 霍健斌 摄 股份合作公司...
高端GPU供给紧缺,海外算力租... 截至13:16,算力租赁概念午后拉升,科创创业人工智能ETF(588470)上涨4.94%,创业板人...
小红书推广,官方授权服务商怎么... 在当今数字化营销的时代,小红书推广已成为众多企业提升品牌知名度和产品销量的重要手段。然而,面对市场上...
小红书酝酿12年的电商突围战:... 当京东、淘天、抖音在618的牌桌上明争暗斗时,小红书搭起了另一座擂台。 上海静安寺地铁站里,小红书没...
何明医生:怎么判断是不是得了脏... 脏虚证不是某一项化验单上的指标,而是身体整体机能下滑的综合表现。判断是否“脏虚”,关键看症状和持续时...
一箱降12元!胖东来多款热门自... 6月17日,多位网友称,发现胖东来多款网红自营产品悄悄下调了价格,包括果汁、燕麦桶等深受消费者追捧的...
华尔街正向美国监管机构施压 要... 财联社6月18日讯(编辑 周子意)华尔街各机构目前正对美国监管机构施压,认为其实施的“巴塞尔资本规则...
医疗健康领域投融资日报(6月1... 据亿欧数据统计,昨日( 2026年6月17日)共披露 19起投融资事件,涉及 17家国内企业, 2家...
2026四川国际美酒博览会在绵... 6月18日上午,2026四川国际美酒博览会开幕式暨第三届中国酒业“华夏美学”大会在绵竹剑南老街举行。...
6月19日大空头集体开火!3万... 上市三天,市值碾压巴菲特,马斯克登顶万亿富豪。但电影《大空头》的原型们却坐不住了。 2026年6月,...