XML&反射

目标:

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对象的建立,就无法使用对象。这时可以根据配置文件的类全名去找对应的字节码文件,并加载进内存,并创建该类对象实例。这就需要使用反射技术完成。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值