目标:
1、可以编写xml存放任意内容
2、通过DTD约束编写指定格式的xml
3、通过Schema约束编写指定格式的XML
4、可以使用DOM4J解析xml
5、会使用反射对类、方法、构造进行相应操作。
为了灵活实现的不同路径,执行不同的资源。我们需要使用 XML进行配置;为了限定xml内容,我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析。
什么是XML?
XML全称为Extensible Markup Language,意思是可扩展的标记语言。XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。
XML的常见应用:配置文件、存放数据。
XML文档声明:
<?xml version="1.0" encoding="UTF-8"?>
1、文档声明必须为<?xml 开头,以 ?> 结束
2、文档声明必须从文档的0行0列位置开始。
DTD:文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称和顺序,元素的属性等。
开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2、hibernate等。
什么是Schema?
Schema 是新的xml文档约束;
Schema要比DTD强大很多,是DTD替代者,
Schema本身也是xml文档,但Schema文档的扩展名为xsd,而不是xml。
Schema功能更强大,数据类型更完善
Schema支持名称空间;
与DTD一样,要求可以通过schema约束文档编写xml文档。常见框架使用schema的有:Spring等。
XML解析概述:
开发中比较常见的解析方式有三种,如下:
1)DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
a)优点:元素与元素之间保留结构关系,故可以进行增删改查等操作。
b)缺点:XML文档过大,可能出现内存溢出显现。
2)SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
a)优点:处理速度快,可以处理大文件。
b)缺点:只能读,逐行后将释放资源。
3.PULL:Android内置的XML解析方式,类似SAX。(了解)
常见的解析开发包:
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
jsoup:一种处理HTML特定解析开发包
dom4j:比较常用的解析开发包,hibernate底层采用。
dom4j必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了。
常用API如下:
1.SaxReader 对象
a) read(...) 加载执行xml文档
2.Document对象
a)getRootElement()获得根元素
3.Element对象
a) elements(...) 获得指定名称的所有子元素,可以不指定名称
b)element(...) 获得指定名称第一个子元素,可以不指定名称
c)getName() 获得当前元素的元素名
d) attributeValue(...) 获得指定属性名的属性值
e)elementText(...) 获得指定名称子元素的文本值
f) getText() 获得当前元素的文本内容
例子:处理名字为web.xml的文档。
<web-app version="2.5">
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
</web-app>
获得document。
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("src/cn/itcast/a_xml/web.xml"));
2、获得根元素
Element rootElement=document.getRootElement();
//打印version属性值
String version = rootElement.attributeValue("version");
system.out.println(version);
//3.获得所有子元素,例如: <servlet> <servlet-mapping>
List<Element> allChildElement = rootElement.elements();
//4 遍历所有
for(Element childElement: all ChildElement){
//5.1 打印元素名
String childEleName = childElement.getName();
System.out.println(childEleName);
//5.2 处理<servlet>,并获得子标签的内容,例如:<servlet-name>等
if("servlet".equals(childEleName)){
//方式1:获得元素对象,然后获得文本
Element servletNameElement = childElement.element("servlet-name");
String servletName=servletNameElement.getText();
System.out.println("\t"+servletName);
//方式2:获得元素文本值
String servletClass=childElement.elementText("servlet-class");
System.out.println("\t"+servletClass);
}
}
1.什么是反射技术?
动态获取指定类以及类中的内容(成员),并运行其内容。
应用程序以及运行,无法在其中进行new对象的建立,就无法使用对象。这时可以根据配置文件的类全名去找对应的字节码文件,并加载进内存,并创建该类对象实例。这就需要使用反射技术完成。