1.xml用在传递数据(大多用json)和配置文件
- 文档声明必须为<?xmi开头,以7>结束;
文档声明必须从文档的0行0列位置开始;
文档声明只有三个属性:
versioin:指定XML文档版本。必须属性,不会选择1.1(不向下兼容),只会选择1.0;
encoding:指定当前文档的编码。可选属性,默认值是utf-8 - xml中符号转化:
< <
> >
" "
' &apos
& &
--------------
在cdata区中不会被编译按源码进行
<![CDATA[
内容
]]>
2.dtd xml文件约束(较少使用)
- 内部DTD,在XML文档内部嵌入DT D,只对当前XML有效。外部dtd关键字system,公共关键字public
3.schema
- 替代dtd,约束文件和要编写的放在一起
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>cn.fb.schmer.Son</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>name-map</servlet-name>
<url-pattern>/url1</url-pattern>
</servlet-mapping>
</web-app>
4.dom4j解析器
- 开发中比较常见的解析方式有三种,如下:
DOM:要求解析器把鸭个XML文档装载到内存,并解析成一个。ocument对象。
。)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
b)缺点:XML文档过大,可能出现内存溢出显现。
SAX:是一种速度更快,更有效的方法。‘已逐行扫描文档,一边扫描一边解析。并以事件驱动的
方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
a)优点:处理速度快,可以处理大文件
b)缺点:只能读,逐行后将释放资源。
PULL: Android内置的XML解析方式,类似SAXo(了解)
常见的解析开发包:
.JAXP: sun公司提供支持DOM和SAX开发包
.J Dom:dom4j兄弟
.jsoup:一种处理H丁ML特定解析开发包
.dom4j:匕较常用的解析开发包,hibernate底层采用。
···
---------解析xml文件获得class反射路径--------
@Test
public void show1(){
try {
SAXReader read=new SAXReader();
Document doc = read.read("src/cn/fb/xml/dom4j/web.xml");
Element root = doc.getRootElement();
Element let = root.element("servlet");
Element classname = let.element("servlet-class");
Class class1=Class.forName(classname.getText());
Person son=(Person) class1.newInstance();
son.init();
son.body();
son.destory();
} catch (Exception e) {
e.printStackTrace();
}
}
···
5.反射
- 动态创建对象获得方法并执行
- 三种方法
Person p = new Person();//创建Peron对象
Class clazz = p.getClass();
--------
Class clazz = Person.class;
--------------
Class clazz = Class.forName("cn.itcast.bean.Person");//必须类全名
-----------------------
清单1,获取字节码文件中的字段。
Class clazz = Class.forName("cn.itcast.bean.Person");
//获取该类中的指定字段。比如age
Field field = clazz.getDeclaredField("age");//clazz.getField("age"); //为了对该字段进行操作,必须要先有指定类的对象。
Object obj = clazz.newInstance();
//对私有访问,必须取消对其的访问控制检查,使用AccessibleObject父类中的setAccessible的方法
field.setAccessible(true);//暴力访问。尽量不要访问私有
field.set(obj, 789);
//获取该字段的值。
Object o = field.get(obj);
System.out.println(o);
备注:getDeclaredField:获取所有属性,包括私有。
getField:获取公开属性,包括从父类继承过来的,不包括非公开方法。
清单2,获取字节码文件中的方法。
//根据名称获取其对应的字节码文件对象
Class clazz = Class.forName("cn.itcast.bean.Person");
//调用字节码文件对象的方法getMethod获取class对象所表示的类的公共成员方法(指定方法),参数为方法名和当前方法的参数,无需创建对象,它是静态方法
Method method = clazz.getMethod("staticShow", null);
//调用class对象所表示的类的公共成员方法,需要指定对象和方法中的参数列表
method.invoke(null, null);
………………………………………………………………………………………………………
Class clazz = Class.forName("cn.itcast.bean.Person");
//获取指定方法。
Method method = clazz.getMethod("publicShow", null);
//获取指定的类对象。
Object obj = clazz.newInstance();
method.invoke(obj, null);//对哪个对象调用方法,是参数组
好处:大大的提高了程序的扩展性。