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

最后

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

相关内容

热门资讯

去地产化短期阵痛:珠免集团20... 珠免集团(600185)1月19日晚间公告,预计2025年实现归属于母公司所有者的净利润亏损9.2亿...
京东工业+大觉新材“双碳”破局 (文/观察者网 张志峰) 绿色转型不是选择题,而是制造业高质量发展的必答题。 在“双碳”目标纵深...
1公斤200元,金银之后又一金... 最近,贵金属市场热潮涌动,特别是黄金和白银价格一路走高,成为大众追捧的投资焦点。而在这股热潮之下,又...
新三板打造专精特新服务高地 2... 新华社北京1月19日电 《中国证券报》19日刊发文章《新三板打造专精特新服务高地 2025年新增同意...
原创 特... 美国誓要拿下格陵兰岛,谁敢阻拦就要被加税,特朗普威胁话音刚落,德军麻利儿的撤了。 谁都知道,格陵兰...
原创 2... 嚯,听说了吗?金价好像下来点了。昨儿个楼下阿姨聊天还念叨,说想给闺女打镯子,不知道这会儿买是不是能省...
路畅科技将迎三连亏!此前转让子... 1月19日晚间,深圳市路畅科技股份有限公司(证券简称:路畅科技,股票代码:002813)公告称,公司...
绩优基金也“换将”?增聘优化管... 本报记者 彭衍菘 2026年开年,公募基金行业投研团队调整动作频频。截至1月18日,年内已有56家基...
李强总理座谈会上,上海企业CE... 中共中央政治局常委、国务院总理李强1月19日下午主持召开专家、企业家和教科文卫体等领域代表座谈会,听...
厦门象屿:象屿铝业正积极推进商... 来源:滚动播报 (来源:财闻) 2026年开年,象屿铝业正积极推进商业火箭型材认证,可望为公司参与万...
君乐宝冲刺港股:年营收近200... 雷递网 乐天 1月19日 综合乳制品企业君乐宝乳业集团股份有限公司(简称“君乐宝”)今日正式向香港联...
四方达:股东付玉霞计划减持公司... 每经AI快讯,四方达1月18日晚间发布公告称,持有河南四方达超硬材料股份有限公司股份约3420万股(...
股票异动停牌核查完毕 400亿... 今日聚焦 【易点天下:停牌核查结束 明起复牌】 【华菱线缆:终止收购星鑫航天控制权 标的公司为神舟系...
再现大比例反对票!上市银行收购... 村镇银行改革节奏稳步推进,但收购方银行股东投票环节中的分歧也屡见不鲜。近日,苏州农商行吸收合并张家港...
北京国丹医院刘云涛:女性白癜风... 白癜风是常见的色素脱失性皮肤病,以皮肤白斑为典型表现,可累及全身各部位,严重时影响容貌美观。女性白癜...
高立执掌华润饮料,将如何重构快... 出品|中访网 审核|李晓燕 近期,港交所上市刚满一年的华润饮料迎来关键人事迭代。公司公告显示,执行董...
政策利好加持!商业不动产REI... 上周公募REITs二级市场价格波动下跌。截至上周五(1月16日),中证REITs(收盘)和中证REI...
掌阅科技摇摆的17年 文 | 新立场Pro 手握海量IP,成湘均的梦想是创造第二个“张凌云时代”。 2025年,掌阅迎来...
33.38亿!刘永好实控的新希... 微成都报道日前,新希望(000876.SZ)披露向特定对象发行A股股票方案调整公告,募集资金总额由不...