IDEA使用和XML

1. IDEA使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhsG1aEY-1584025829088)(img/IDEA注释修改.png)]

IDEA使用慢慢来

2. XML

2.1 XML概述
Extensible Markup Language
可拓展标记语言用途:1. 数据存储,小型数据库,存在一定的CRUD操作可行性2. 网络端数据的传输3. JavaWEB框架项目配置文件Spring Druid ....w3c万维网联盟指定的规范
2.2 基本语法
1. XML文件后缀名是.xml
2. XML第一行是对于当前文件的定义声明
3. XML文件中有且只有一个根标签
4. 属性值必须使用引号包含,这里推荐使用双引号
5. 标签必须正确匹配,正确开始和关闭
6. XML标签内严格区分大小写
<?xml version="1.0" encoding="utf-8"?>
<users><user id="1"> <name>骚磊</name><age>16</age><gender>male</gender></user><user id="2"> <name>骚杰</name><age>16</age><gender>male</gender></user>
</users>
2.3 XML文件组成部分
1. 文档声明:a. 格式:<?xml 属性列表 ?><?xml version="1.0" encoding="utf-8" ?>version: 当前XML文件版本号encoding: 编码方式,这里建议XML文件的保存编码集和对应的解析编辑一致。standalone:是否依赖于其他文件 [了解]yes 不依赖, no 依赖
2. 指令(了解)这里可以导入一些CSS样式<?xml-stylesheet type="text/css" href="test.css" ?>
3. 标签内容自定义规则:   a. 自定义标签允许使用英文字母,数字和其他标点符号(_ - .)b. 不允许使用数组和标点符号开头,只能用英文字母c. 不允许在自定义标签内使用xml标记,XML也不行d. 名字不允许出现空格4. 属性可以给标签一个属性,有时候要求ID属性是惟一的5. 文本(了解)CDATA区,所见即所得,CDATA区内容是完整展示的格式:<![CDATA[ 数据 ]]>
2.4 XML文件数据约束
1. DTD一种简单的约束方式但是存在一定的约束问题
2. Schema一种复杂XML文件约束方式非常严谨
2.4.1 DTD约束
<!-- students 根标签 要求根标签内存放student -->
<!ELEMENT students (student*) >
<!-- student标签包含子标签的内容 -->
<!ELEMENT student (name,age,sex)>
<!-- 所有子标签当前数据都都是文本形式 -->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!-- ATTLIST Attribute List 属性列表 student id ID -->
<!ATTLIST student id ID #REQUIRED>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE students SYSTEM "D:\NZ\IEDA\Day25_SL_IDEA\src\com\qfedu\b_dtd\student.dtd">
<!--<!DOCTYPE students [-->
<!--        &lt;!&ndash; students 根标签 要求根标签内存放student &ndash;&gt;-->
<!--        <!ELEMENT students (student*) >-->
<!--        &lt;!&ndash; student标签包含子标签的内容 &ndash;&gt;-->
<!--        <!ELEMENT student (name,age,sex)>-->
<!--        &lt;!&ndash; 所有子标签当前数据都都是文本形式 &ndash;&gt;-->
<!--        <!ELEMENT name (#PCDATA)>-->
<!--        <!ELEMENT age (#PCDATA)>-->
<!--        <!ELEMENT sex (#PCDATA)>-->
<!--        &lt;!&ndash; ATTLIST Attribute List 属性列表 student id ID &ndash;&gt;-->
<!--        <!ATTLIST student id ID #REQUIRED>-->
<!--        ]>-->
<!-- 可以约束一些基本id不可重复,标签组合排序,但是无法要求标签内保存的内容 -->
<students><student id="qf1"><name>骚磊</name><age>fdasfdsaf</age><sex>male</sex></student><student id="qf2"><name>骚磊</name><age>16</age><sex>male</sex></student>
</students>
2.4.2 Schema约束
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.qfedu.com/xml"xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.qfedu.com/xml" elementFormDefault="qualified"><!-- 根节点名字和包含的内容,内容是自定义studentType --><xsd:element name="students" type="studentsType"/><!-- studentType类型声明   --><xsd:complexType name="studentsType"><xsd:sequence><!-- students根节点中存放的是student类型  type="studentType" 要求student的个数从0开始 个数不限制 --><xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><!-- studentType声明 --><xsd:complexType name="studentType"><xsd:sequence><!-- 要求student标签内有name,age,sex子标签,并且要求对一个对应保存的数据类型是type指定 --><xsd:element name="name" type="xsd:string"/><!-- ageType 和 sexType 是自定义数据约束 --><xsd:element name="age" type="ageType" /><xsd:element name="sex" type="sexType" /></xsd:sequence><!-- 给予Student标签属性 属性为id,要声明idType, use="required"不可缺少的 --><xsd:attribute name="id" type="idType" use="required"/></xsd:complexType><!-- sexType性别类型声明 --><xsd:simpleType name="sexType"><xsd:restriction base="xsd:string"><!-- 有且只有两个数据 male female --><xsd:enumeration value="male"/><xsd:enumeration value="female"/></xsd:restriction></xsd:simpleType><xsd:simpleType name="ageType"><xsd:restriction base="xsd:integer"><!-- 0 ~ 256 要求范围,是一个integer类型 --><xsd:minInclusive value="0"/><xsd:maxInclusive value="256"/></xsd:restriction></xsd:simpleType><xsd:simpleType name="idType"><xsd:restriction base="xsd:string"><!-- ID类型,要求gp_xxxx(四位数字) --><xsd:pattern value="gp_\d{4}"/></xsd:restriction></xsd:simpleType>
</xsd:schema>
<?xml version="1.0" encoding="utf-8"?><!--
1. 填写根节点约束
2. 引入xsi前缀,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3. 引入xsd文件命名空间 xsi:schemaLocation="http://www.qfedu.com/xml  student.xsd"
4. 为xsd约束声明一个前缀,作为表示
-->
<students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.qfedu.com/xml"xsi:schemaLocation="http://www.qfedu.com/xml  student.xsd"
><student id="gp_0001"><name>骚磊</name><age>5</age><sex>male</sex></student><student id="gp_0002"><name>骚杰</name><age>17</age><sex>male</sex></student>
</students>

3. XML解析

3.1 XML解析思路
DOM解析Document Object Model 文件对象模型把XML整个文件看做一个Document对象,每一个节点看做一个Element,节点中有Attribute,或者当前节点中存在Text文本内容。DOM是将整个XML文件读取到计算机内存中,可以进行CRUD操作。缺点:占用了大量内存空间适用的环境:服务器对于XML文件的解析过程。SAX解析逐行读取,给予一定的事件操作。读取一行内容,释放上一行内容,可以有效的节约内存空间缺点:不能对XML文件,进行增删改适用的环境:手机读取解析XML文件时采用的方式。
3.2 DOM图例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfTc6ksc-1584025829089)(img/XML文件DOM.png)]

3.3 XML文件解析工具
1. JAXP: SUN提供的一个基本的解析器,支持DOM和SAX两种解析方式,但是操作很繁琐,不便于程序员开发。2. Dom4j: DOM For Java 一款非常优秀的解析器Spring,SpringMVC... 框架中集成的XML解析器3. Jsoup: 基于Java完成的对于HTML解析的工具,因为HTML和XML文件都是标记语言。给Jsoup一个URL,页面地址. Java的小爬虫,API很多很方便4. PULL:Android手机上集成的XML解析工具,SAX方式解析
3.4 Dom4j使用入门
1. 导包目前使用的是第三方工具,不是原生的JDK导入第三方Jar包
2. 设置IDEA
3. Dom4j涉及到的方法SAXReader();解析XML文件使用的核心类read() --> XML文件Document对象Document document = new SAXReader().read(new File("./xml/User.xml"));Document对象中可以使用方法Element getRootElement();获取当前XML文件的根节点对象Element对象中可以使用方法List elements();   当前节点下的所有子节点List elements(String name);当前节点下所有指定名字的子节点Element element();获取当前节点下的第一个子节点Element element(String name);获取当前节点下指定名字的第一个子节点Attribute getAttribute(String name);根据属性名获取对应的属性对象AttributeAttribute节点中可以使用String getValue()来获取对应的节点数据String getName();获取当前节点的名字String getText();获取当前节点对应的文本数据
package com.qfedu.d_xmlparse;import jdk.nashorn.internal.ir.CallNode;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;/*** @description Dom4j方法演示* @author Anonymous* @data 2020/3/6 15:07*/
public class Demo1 {public static void main(String[] args) throws DocumentException {// 当前XML文件的Document对象Document document = new SAXReader().read(new File("./xml/User.xml"));// 获取根节点 Root ElementElement rootElement = document.getRootElement();// 获取Root Element下子节点List<Element> elements = rootElement.elements();// 可以获取当前节点下的所有子节点// System.out.println(elements);Element teacher = rootElement.element("teacher");// 获取属性节点指定属性值System.out.println(teacher.attribute("id").getValue());List<Element> elements1 = teacher.elements();for (Element element : elements1) {// 获取节点的名字System.out.println(element.getName() + ":" + element.getText());}}
}
3.5 Dom4j Xpath解析读取XML文件
package com.qfedu.d_xmlparse;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;/*** @description Xpath语法解析 XML文件* @author Anonymous* @date 2020/3/6 15:55*/
public class Demo2 {public static void main(String[] args) throws DocumentException {// 当前XML文件的Document对象Document document = new SAXReader().read(new File("./xml/User.xml"));// 获取根节点 Root ElementElement rootElement = document.getRootElement();// 无视目录结构,无视当前解析状态,直接获取所有的user节点List list = rootElement.selectNodes("//user");for (Object o : list) {Element element = (Element) o;int id = Integer.parseInt(element.attributeValue("id"));String name = element.element("name").getText();int age = Integer.parseInt(element.element("age").getText());String gender = element.element("gender").getText();System.out.println("User[id=" + id + ", name=" + name+ ", age=" + age + ", gender=" + gender + "]");}System.out.println("--------------------------------------");System.out.println();// //user[index] 不考虑路径关系,获取当前XML文件中指定下标的user节点Node node = rootElement.selectSingleNode("//user[1]");System.out.println(node);System.out.println("--------------------------------------");System.out.println();// //user[@id=9] 不考虑路径关系,获取当前XML文件中指定属性为id,值为9的user节点// @之后是属性 @id 这里需要匹配的是属性Node node1 = rootElement.selectSingleNode("//user[@id=9]");System.out.println(node1);System.out.println("--------------------------------------");System.out.println();// //user[gender='male'] 不考虑路径关系,获取当前XML文件中指定子节点为gender,对应子节点文本数据为male// 的user所有节点List list1 = rootElement.selectNodes("//user[gender='male']");for (Object o : list1) {System.out.println(o);}System.out.println("--------------------------------------");System.out.println();List list2 = rootElement.selectNodes("//user[age<20]");for (Object o : list2) {System.out.println(o);}}
}
package com.qfedu.d_xmlparse;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;/*** @description Xpath语法解析 XML文件* @author Anonymous* @date 2020/3/6 15:55*/
public class Demo3 {public static void main(String[] args) throws DocumentException {// 当前XML文件的Document对象Document document = new SAXReader().read(new File("./xml/User.xml"));// 获取根节点 Root ElementElement rootElement = document.getRootElement();System.out.println("--------------------------------------");System.out.println();// //user[last()] 这里是不考虑路径关系,获取最后一个user节点Node node = rootElement.selectSingleNode("//user[last()]");System.out.println(node);System.out.println("--------------------------------------");System.out.println();// //user[last()] 这里是不考虑路径关系,获取前两个User节点List list = rootElement.selectNodes("//user[position() < 3]");for (Object o : list) {System.out.println(o);}System.out.println("--------------------------------------");System.out.println();// //name | // age 无视路径关系,获取所有的name节点和age节点List list1 = rootElement.selectNodes("//name | // age");for (Object o : list1) {Element element = (Element) o;System.out.println(element.getText());}}
}

4. XML文件保存

流程:1. 创建Document对象2. 通过Document对象来添加元素addElment();addAttribute();
package com.qfedu.e_xmlwrite;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;
import java.io.IOException;/*** @description: 创建XML文件* @author: Anonymous* @time: 2020/3/6 16:29** <students>*     <student id="qf1">*         <name>骚磊</name>*         <age>fdasfdsaf</age>*         <sex>male</sex>*     </student>*     <student id="qf2">*         <name>骚磊</name>*         <age>16</age>*         <sex>male</sex>*     </student>* </students>*/
public class Demo1 {public static void main(String[] args) throws IOException {// 1. 创建了一个XML文件对应的Document对象Document document = DocumentHelper.createDocument();// 2. 放入到XML文件对应的Document对象中Element root = document.addElement("students");// 3. 在根节点之下添加了一个student节点,同时设置了属性Element element = root.addElement("student").addAttribute("id", "qf1");// 根节点下添加了对应的子节点,以及对应的文本element.addElement("name").addText("骚磊");element.addElement("age").addText("16");element.addElement("sex").addText("male");// 字符输出流FileWriter fileWriter = new FileWriter("./xml/student.xml");document.write(fileWriter);// 4. 关闭资源fileWriter.close();}
}

5. 反射+XML文件保存读取操作

package f_xmlsave;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;/*** @description:* @author: Anonymous* @time: 2020/3/6 16:46*/
public class MainProject {public static void main(String[] args)throws IllegalAccessException, DocumentException, NoSuchMethodException, InvocationTargetException, IOException {ArrayList<Student> list = new ArrayList<>();readDataFromXML(list);for (Student student : list) {System.out.println(student);}}public static void saveDateToXML(ArrayList<Student> list) throws IllegalAccessException, IOException {// 创建XML文件对应Document对象Document document = DocumentHelper.createDocument();// 明确根节点Element root = document.addElement("students");// 获取所有的成员变量Field对象Field[] declaredFields = Student.class.getDeclaredFields();// 循环遍历Student ArrayList集合for (Student student : list) {// 每一个Student对象都要对应一个Student节点Element element = root.addElement("student");// 遍历所有的Field成员变量for (Field declaredField : declaredFields) {declaredField.setAccessible(true);// id存储到Student节点中的属性中if ("id".equals(declaredField.getName())) {// 所有的数据都是在String类型处理element.addAttribute("id", declaredField.get(student) + "");} else {// declaredField.getName() 成员变量名字 declaredField.get(student) 对应数据element.addElement(declaredField.getName()).addText(declaredField.get(student) + "");}}}// 字符流对象+Document对象的write方法写入XML信息到文件中FileWriter fileWriter = new FileWriter("./xml/student.xml");document.write(fileWriter);fileWriter.close();}public static void readDataFromXML(ArrayList<Student> list)throws DocumentException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {Document document = new SAXReader().read(new File("./xml/student.xml"));// 找出当前XML文件中的所有student节点List list1 = document.selectNodes("//student");// 得到当前Student类内的所有成员变量对象,注意使用暴力反射Field[] declaredFields = Student.class.getDeclaredFields();/*String字符串问题name String getTextgender String getTextid Integer Attribute ==> Integerage Integer getText ==> Integer*/// 遍历所有的Student节点for (Object o : list1) {// Student节点对象Element element = (Element) o;Student student = new Student();// 成员变量Field数组遍历for (Field declaredField : declaredFields) {// 给予暴力反射操作成员变量权限declaredField.setAccessible(true);// 获取当前成员变量的数据类型Class<?> type = declaredField.getType();// 如果数据类型是String类型if (type.equals(String.class)) {// StringdeclaredField.set(student, element.element(declaredField.getName()).getText());} else if (type.equals(Integer.class)) {// Integer类型// 获取Integer类型中的valueOf方法Method valueOf = type.getMethod("valueOf", String.class);if ("id".equals(declaredField.getName())) {/*id是在student节点属性中,从属性中获取对应是数据,使用valueOf方法转换成对应的Integer类型*/declaredField.set(student, valueOf.invoke(student, element.attributeValue("id")));} else {/*非ID数据,从Student指定名字的子节点下获取,指定名字和成员变量名字一直,同样需要转换一下*/declaredField.set(student,valueOf.invoke(student, element.element(declaredField.getName()).getText()));}}}list.add(student);}}
}

6. 作业

1. 反射复习,熟悉,方法背诵
2. 研究XML文件约束方式,会读会写
3. 最后利用反射的方式完成XML文件保存和读取数据的ORM代码完全用于项目中原本txt保存的项目数据,使用XML保存
4. 总结
                   declaredField.set(student, valueOf.invoke(student, element.attributeValue("id")));} else {/*非ID数据,从Student指定名字的子节点下获取,指定名字和成员变量名字一直,同样需要转换一下*/declaredField.set(student,valueOf.invoke(student, element.element(declaredField.getName()).getText()));}}}list.add(student);}}

}

IDEA使用和XML相关推荐

  1. 利用dom4j将实体类转换为对应的xml报文

    利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...

  2. mybatis的资源过滤错误及xml文件编码错误

    mybatis 解决maven项目内资源过滤的问题 写的配置文件无法被导出或者生效的问题. 解决方案: <build><resources><resource>&l ...

  3. 【spring】spring基于xml的声明式事务控制

    结构 domain package com.itheima.domain;import java.io.Serializable;public class Account implements Ser ...

  4. 【Spring】基于xml实现事务控制(银行转账)

    代码结构 domain类 package com.itheima.domain;import java.io.Serializable;/*** 账户的实体类*/ public class Accou ...

  5. 【Spring】基于XML的IOC案例

    代码结构: bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...

  6. Python 标准库之 xml.etree.ElementTree xml解析

    Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...

  7. python读取xml文件报错ValueError: multi-byte encodings are not supported

    1.在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported 很多贴子上说把xml的编码格式改为,就可以正常执 ...

  8. MyBatis——XML配置解析

    目录 1. 环境配置(environments) 2. 属性(properties) 3. 类型别名(typeAliases) 方式一:通过typeAlias起别名 方式二:通过package起别名 ...

  9. linux下用js生成xml,js2xml:将javascript字符串转换为xml

    有时候爬数据遇到像下面这种,数据在script标签中以javascript形式存在. var totalReviewsValue = 32; var averageRating = 4.5; if(t ...

  10. Unable to preview the file. Please open a JS, CSS or HML file of the JS UI framework or a layout.xml

    这个是DevEco 开发工具提示的. 这个问题是打开HarmonyOS graphic 里面的xml文件,比如自己画了一个shape想预览下 什么效果,出现了这个问题, 就是不支持,刚开始想了半天为啥 ...

最新文章

  1. 多对多关联映射(双向)
  2. 前端学习(2731):重读vue电商网站41之自定义格式化时间的全局过滤器
  3. python 面试题 -------------- get 和 post 请求的 区别
  4. 【Laravel】使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
  5. ARC097F Monochrome Cat
  6. web中将DataTable作为数据源导出Excel (带格式)
  7. 在构建好XPE操作系统上增加EWF功能
  8. 数字图像处理--噪声
  9. 【Qt-Camera】大华相机显示线程
  10. 解决post请求跨域请求第三方服务器
  11. python中oserror winerror,在python中将WindowsError转换为OSError
  12. 百分浏览器cent browser 和他的扩展程序朋友们
  13. (dfppy)2Ir(NHC)的蓝光/蓝绿光铱配合物|苯基喹啉酯的中性铱配合物-齐岳生物
  14. 和风天气 (简易版)
  15. 统计英文名著中单词出现频率
  16. 【北航操作系统笔记(完整版)】
  17. 软件测试面试题汇集(2)
  18. [深度学习基础] 斯坦福CS231n李飞飞计算机视觉Lecture 7笔记
  19. 牛逼!前端神器,永远滴神!
  20. 接入微信支付伪代码(Springboot实现)

热门文章

  1. 企业线上培训平台哪个比较好
  2. LitCTF2023 郑州轻工业大学首届网络安全赛 WP 部分
  3. 第019讲:函数:我的地盘听我的 | 课后测试题及答案
  4. 如何在plsql/developer的命令窗口执行sql脚本
  5. 宏基aspire拆机触摸_Acer 4530笔记本怎么拆机? 宏基Acer Aspire 4530拆机教程
  6. 该如何把小程序安装成APP?
  7. [CodeWars] Convert Decimal Degrees to Degrees, Minutes, Seconds
  8. 电脑很流畅,但是一登qq就特别卡
  9. Java经典好书推荐-从入门到进阶
  10. 联想自带win7家庭版升级win7旗舰版