Day11.xml&反射
1.xml简介:
-
概述:
XML: 全称为Extensible Markup Language ,意思是可扩展的标记语言
Xml标签特点:是一种自定义标签,我们可以进行自定义。
HTML:超文本标记语言(Hyper Text Markup Language)
Html标签特点:标签是预定义好的,我们不可以自己随便定义。
-
作用:
-
配置文件
-
存储数据,传输数据(已过时)
-
-
书写规范:
-
xml文档必须有根元素,有且仅有一对根元素
-
xml文档必须有关闭标签,标签成对出现,或者是自关闭
-
xml标签对大小写敏感,区分大小写
-
xml元素必须被正确嵌套
-
属性必须加引号
-
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始 —–(建议)
名称不能包含空格
-
-
特殊字符:
-
xml组成:
-
声明:<?xml version=”1.0″ encoding=”UTF-8″?>
a. version:指定xml文档版本,必须属性,我们不会选择1.1,只会选择1.0
b.encoding:指定当前文档的编码,默认值是utf-8
-
元素: element
-
<servlet>
1.元素是xml文档中最重要的组成部分,
2.普通元素的结构开始标签 元素体 结束标签组成。例如<hello>大家好</hello>
3.元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>
4.空元素:只有开始标签,没有结束标签,但元素必须自己闭合。例如:</c>
5.元素命名规则:a.区分大小写 b.不能使用空格 c.不建议以XML 、xml、Xml开头
6.格式化良好的XML文档,必须只有一个根元素
-
属性:
<web-app version=”2.5″>
1.属性是元素一部分,它不许出现在元素的开始标签中
2.属性的定义格式:属性名=属性值,其中属性值必须使用单引号或双引号
3.一个元素可以有0-N个属性,但是一个元素中不能出现同名属性
4.属性名不能使用空格、冒号等特殊字符,且必须以字母开头
-
注释:
<!– –>
-
CDATA区:
<![CDATA[]]>:内容原样显示
-
xml解析:
概述:当将数据存储在xml后,我们就希望通过程序获得xml内容。。人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作xml
解析方式:
DOM
概述:要求解析器把整个xml文档装在到内存,并解析成一个Document对象
优点:元素与元素之间保留结构关系,故可以进行增删改查操作
缺点:xml文档过大,可能出现内存溢出现象
SAX:
概述:是一种速度更快,更有效的方法,它逐行扫描文档,一别扫描一别解析,并以事件驱动的方式进行具体解析,每执行一行,豆浆触发对应的事件
优点:处理速度快,可以处理大文档
缺点:只能读,逐行后将释放资源
PULL:
概述:Android内置的xml解析方式,类似SAX
常见解析开发包:
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
jsoup:一种处理HTML特定解析开发包
dom4j:比较常用的解析开发包,hibernate底层采用
-
dom4j:
使用步骤:
-
步骤一:导入jar包
-
步骤二:准备相应的xml文件
-
步骤三:写java代码进行解析
-
查看api(抄)
-
常用API如下:
-
-
代码实现:
package cn.itcast_01; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; public class Dom4jTest { @Test public void demo01() throws DocumentException{ //创建解析器 SAXReader reader = new SAXReader(); //对具体的文件进行解析,(参数:文件的路径) Document document = reader.read(“WebContent/dom4j/persons.xml”);
//得到根元素 Element root = document.getRootElement(); //获得子元素 List<Element> elements = root.elements(); for (Element element : elements) { System.out.println(element); } }
@Test public void demo02() throws DocumentException{ //创建解析器 SAXReader reader = new SAXReader(); //读取相应的xml文件, Document document = reader.read(“WebContent/dom4j/persons.xml”);
//获得根元素 Element root = document.getRootElement(); //获得根元素下的所有子元素 List<Element> elements = root.elements(); //System.out.println(elements);
//获得第一个子元素 Element element = elements.get(0);
//获得标签的名字 String name = element.getName(); //System.out.println(name);
//获得指定的属性对象 Attribute attribute = element.attribute(“id”); //通过属性对象获得属性值 String value = attribute.getValue(); //System.out.println(value);
//直接获得相应的属性值 String value2 = element.attributeValue(“id”); System.out.println(value2);
//获得指定标签元素对象 Element element2 = element.element(“name”);
//获得相应标签文本值 String text = element2.getText(); System.out.println(text);
//直接获得指定标签的文本内容 String text2 = element.elementText(“name”); System.out.println(text2);
}
} |
-
Xpath
-
概述:是一种基于dom4j可以快速对xml文件进行遍历
-
使用步骤
-
步骤一:导入jar包(dom4j的包和xpath的包)
-
步骤二:document.selectNodes(xpath语法) document。SelectSingleNode(xpath语法)
-
步骤三:写一个类:
-
抄API
-
-
-
代码:
package cn.itcast.xpath; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.junit.Test; public class XpathDemo { @Test public void demo01() throws Exception{ //创建解析器 SAXReader reader = new SAXReader();
//读取文档对象 Document document = reader.read(“WebContent/dom4j/persons.xml”);
//xpath操作 //bbb List<Element> element = document.selectNodes(“//name”); for (Element element2 : element) { String text = element2.getText(); System.out.println(text);
} }
@Test public void demo02() throws Exception{ //创建解析器 SAXReader reader = new SAXReader(); //读取文档对象 Document document = reader.read(“WebContent/dom4j/persons.xml”); //xpath操作 //BBB[@id=”b1″] Node selectSingleNode = document.selectSingleNode(“//person[@id=’001′]/name”); String text = selectSingleNode.getText(); System.out.println(text); } } |
2. xml约束
:规定
(1)DTD约束:
比较老 语法比较简单 好学。
a)内容约束:有两类:(因为我们的标签有两类,子标签和文本值)
i. +:相应的子标签有 大于等于1个。
*:可以有子元素 也可以没有子元素
?:可以有0个或者1个子元素
|:选择
():分组
ii. 文本值
(#PCDATA):简单的理解为可以写出了标签之外的文本内容
ANY:我们可以在开始标签和结束标签之间写任意内容
EMPTY: 没有文本内容。
b)属性的约束:<!ATTLIST 标签 标签的属性 值 类别>
C)导入方式:
(2)Schema约束:
a).概述:是新的xml文档的约束,比DTD强大很多,是其的替代者。Schema本身也是xml文档,但其扩展名为xsd,其功能更强大,数据类型更完善,支持名称空间
b).分类:
i.简单标签:无元素、无属性
ii.复杂标签:有子元素,有属性
使用element修饰标签:
maxOccurs:最多有几个子标签。
minOccurs:最少有几个子标签。
使用attribute修饰属性:
<attribute name=”bid” type=”int” use=”prohibited”/>
属性的修饰
name:属性的名字。
type: 属性值的类型
use:属性值的设置
prohibited:必须不能有属性
required:必须有属性值
optional:可以有属性值 也可以没有。
3.反射(reflect)
-
概述:java反射机制是在运行状态中,对于任意一个类,都能够知道这个类和所有属性的方法,对于任意一个对象,都能够调用它的任意一个方法和属性
使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段Field进行操作
-
Class对象:
概述:是对class文件(字节码文件)的描述对象
获得Class对象:
已经类的完整路径名(字符串):Class.froName(…)
已经类型:String.class , 确定参数列表
已经对象:obj.getClass()
常用方法:
使用默认构造方法创建实例
c) Constructor对象:
概述:是构造方法的描述对象
获得构造方法:
公共的构造方法:Constructor<T> getConstructor(Class<?>…parameterTypes),可变参数用于确定形式参数列表
已经声明的构造方法:Constructor<T>getDeclaredConstructor(Class<?>…parameterTypes), 获得私有的构造
实例化对象实例:
newlnstance(Object… initargs),可变参数用于确定实际参数列表
d). Method对象:
概述:是普通方法的描述对象
获得方法:
获得公共方法:Method getMethod(String name, Class<?>… parameterTypes) 通过方法name获得方法,可变参数为方法的形式参数列表
获得声明方法:Method getDeclaredMethod(String name, Class<?>… parameterTypes) 方法操作
执行指定的方法:Object invoke (Object obj , Object… args) 执行指定对象obj,指定方法,可变参数为方法的实际参数列表
e). Field对象:
概述:是字段的描述对象
获得方法;
所有字段:Filed getFiled(String name) 通过字段名称
声明字段:Filed getDeclaredFiled(String name)
操作:
获得内容:Object get (Object obj)
设置内容:void set (Object obj,Object value),确定实例对象