XML
1.XML-概述
- XML的全称为(Extensible Markup Language),是一种可扩展的标记语言
- 标记语言:通过标签来描述数据的一门语言
- 可扩展:标签的名字是可以自定义的
- 作用
- 用于进行存储数据和传输数据
- 用于软件的配置文件
2.XML-标签
- 标签由一对尖括号和合法标识符组成
- 标签必须成对出现
- 特殊的标签可以不成对,但是必须有结束标签
- 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
- 标签需要正确的嵌套
3.XML-语法规则
-
XML文件的后缀名为:xml
-
必须存在一个根标签,有且只有一个
-
文档声明必须在第一行第一列
<?xml version="1.0" encoding= "UTF-8" standalone="yes" ?>
- version:版本号,必须的属性
- encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
- standalone:描述XML文件是否依赖其他的xml文件,取值为yes/no
-
XML文件中可以定义注释信息
-
XML文件中可以存在以下特色字符
-
XML文件中可以存在CDATA区:<![CDATA[ 数据 ]]>
4.XML-解析的准备工作
-
常见的解析工具
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- PULL:Android操作系统内置的解析器
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
-
代码实现
- xml文件
<?xml version="1.0" encoding="UTF-8" ?> <Students> <student id="1"> <name>李四</name> <age>21</age> </student> <student id="2"> <name>张三</name> <age>22</age> </student> </Students>
- 测试类
public class XmlParse { public static void main(String[] args) throws DocumentException { //1.创建解析器对象 SAXReader saxReader = new SAXReader(); //2.利用解析器把配置文件加载到内存中 Document document = saxReader.read(new File("itheima_XML\\xml\\student.xml")); //3.获取跟目录 Element rootElement = document.getRootElement(); //4.获取根目录下的子目录 //elements()这个不带参数的方法是把左右子目录返回一个集合 // List elements = rootElement.elements(); //elements("student") 指定所有的子目录 List<Element> studentElements = rootElement.elements(); ArrayList<Student> list = new ArrayList<>(); for (Element element : studentElements) { //获取id这个属性 Attribute attribute = element.attribute("id"); String id = attribute.getValue(); //获取name标签 Element nameStudent = element.element("name"); String name = nameStudent.getText(); //获取age标签 Element ageStudent = element.element("age"); String age = ageStudent.getText(); Student student = new Student(id, name, Integer.parseInt(age)); list.add(student); } for (Student student : list) { System.out.println(student); } } }
5.DTD约束
-
阅读约束文档
- DTD语法规则
-
根据约束写xml文件
6.schema约束
- 写schema约束的步骤
- 引入schema约束的步骤
- schema定义属性
枚举
1.概念
-
枚举:是指将变量的值一个个的列出来,变量的值只限于列举出来的值的范围
-
格式
public enum s{ 枚举项1,枚举项2,枚举项3; }
-
注意:定义枚举类要用关键字enum
2.特点
- 所有枚举类都是Enum的子类
- 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
- 每一个枚举项其实就是该枚举的一个对象
- 枚举也是一个类,可以去定义成员变量
- 枚举类的第一行上必须是枚举项
- 枚举类可以有构造器,但是必须private的。它默认的也是private的,枚举项的用户比较特殊:枚举("")
- 枚举类也可以有抽象方法,但是枚举项必须重写该方法
public enum Season {
SPRING("spring"){
@Override
public void getSeason() {
}
},
SUMMER("summer"){
@Override
public void getSeason() {
}
},
AUTUMN("autumn"){
@Override
public void getSeason() {
}
},
WINTER("winter"){
@Override
public void getSeason() {
}
};
private String name;
/*private Season(){
}*/
private Season(String name){
this.name=name;
}
public abstract void getSeason();
}
- 注意
- 当注释掉无参构造的时候的,需要每个枚举项用有参构造
- 有抽象方法的时候,每一个枚举项需要重写抽象方法
3.方法
-
常见方法
方法名 说明 String name() 获取枚举项的名称 int ordinal() 返回枚举项在枚举类中的索引值 int compareTo(E o) 比价俩个枚举项,返回的是索引值的差值 String toString() 返回枚举常量的名称 static T valueOf(Class type,String name) 获取指定枚举类中的指定名称的枚举值 values() 获取所有的枚举值 -
代码实现
public class SeasonDemo { public static void main(String[] args) { //String name() 获取枚举项的名称 String name = Season.SPRING.name(); System.out.println(name); System.out.println("=========="); //int ordinal() 返回枚举项在枚举类中的索引值 int spring = Season.SPRING.ordinal(); int summer = Season.SUMMER.ordinal(); System.out.println(spring); System.out.println(summer); System.out.println("=========="); //int compareTo(E o) 比价俩个枚举项,返回的是索引值的差值 int i = Season.SPRING.compareTo(Season.WINTER); System.out.println(i); System.out.println("=========="); //String toString() 返回枚举常量的名称 String s = Season.SPRING.toString(); System.out.println(s); System.out.println("=========="); //static<T> T valueOf(Class<T> type,String name) 获取指定枚举类中的指定名称的枚举值 Season spring1 = Enum.valueOf(Season.class, "SPRING"); System.out.println(spring1); System.out.println(Season.SPRING==spring1); System.out.println("=========="); //values() 获取所有的枚举值 Season[] values = Season.values(); for (Season value : values) { System.out.println(value); } } }
注解
注解用来给代码添加一些额外的标注,可以写在类上,写在方法上,写在变量上。
1.Java的内置注解
@Override: 复写父类方法
@Deprecated: 标记这个方法过时了
@SuppressWarnings: 压制警告
2.自定义注解
//表示注解的存活时间,在运行时有效
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
public @interface Anno {
//定义注解的属性,default设置默认值
public String name();
public String methodname();
}
3.使用反射来解析注解
@Anno(name = "com.itheima.Teacher",methodname = "teach")
public class Demo {
public static void main(String[] args) throws Exception {
//获取Demo类的字节码
Class<Demo> clazz = Demo.class;
//获取类上的注解
Anno anno = clazz.getAnnotation(Anno.class);
//获取注解的属性
String classname = anno.name();
String methodname = anno.methodname();
//获取要执行的类的字节码
Class<?> stuClazz = Class.forName(classname);
//通过字节码创建的对象
Object obj = stuClazz.getConstructor().newInstance();
//获取方法
Method method = stuClazz.getMethod(methodname);
//执行方法
method.invoke(obj);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z7tjqWkp-1608381966369)(E:\Documents\笔记\Java笔记\Java笔记\JavaSE\assets\Snipaste_2020-12-08_10-48-25.png)]