XML基础
定义:
可扩展的标签语言。
作用:
配置文件
XML解析:
XML解析方式:
1.sax:特点:逐行解析,只能查询。
2.dom:特点:一次性将文档加载到内容中,形成一个dom树,可以对dom树进行curd操作。
解析技术:
★dom4j:比较常用的解析开发包,hibernate底层采用。
dom4j技术进行查询操作.
使用步骤:
1.导入jar包
2.创建一个核心对象 SAXReader
new SAXReader();
3.将xml文档加载到内存中形成一棵树
Document doc=reader.read(文件路径)//注意文件路径在写/的时候注意需要转义为//
4.获取根节点
Element root=doc.getRootElement();
5.通过根节点就可以获取其他节点(文本节点,属性节点,元素节点)
获取所有的子元素
List<Element> list=root.elements()
获取元素的指定属性内容
String value=root.attributeValue("属性名");
获取子标签标签体:遍历list 获取到每一个子元素
String text=ele.elementText("子标签名称")
代码:
1 package com.uestc; 2 import java.util.List; 3 import org.dom4j.Document; 4 import org.dom4j.Element; 5 import org.dom4j.io.SAXReader; 6 public class Dom4jDemo { 7 public static void main(String[] args) throws Exception 8 { //创建核心对象 9 SAXReader reader=new SAXReader(); 10 //获取dom树 11 Document doc=reader.read("D:\workspace\test1\xml\web.xml"); 12 //获取根节点 13 Element root=doc.getRootElement(); 14 //获取其他节点 15 List<Element> list=root.elements(); 16 //遍历集合 17 for(Element ele :list) 18 { 19 //获取servlet-name的标签体 20 String text=ele.elementText("servlet-name"); 21 //获取url-pattern的标签体 22 System.out.println(text); 23 System.out.println(ele.elementText("url-pattern")); 24 } 25 String value=root.attributeValue("version"); 26 System.out.println(value); 27 //获取root的version属性值 28 } 29 30 }
输出:
HelloMyServlet
null
HelloMyServlet
/hello
2.5
xpath解析技术:(扩展)
依赖于dom4j 使用步骤:
1.导入jar包(dom4j和jaxen-1.1-beta-6.jar)
2.加载xml文件到内存中
3.使用api
selectNode("表达式");
selectSingleNode("表达式");
表达式的写法:
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
例如一个标签下有一个id属性且有值 id=2;
//元素名[@属性名='属性值']
//元素名[@id='2']
代码:
1 package com.uestc.xpath; 2 import java.util.List; 3 import org.dom4j.Document; 4 import org.dom4j.DocumentException; 5 import org.dom4j.Element; 6 import org.dom4j.io.SAXReader; 7 8 public class XpathDemo { 9 public static void main(String[] args) throws DocumentException 10 { 11 //加载dom树 12 Document doc=new SAXReader().read("D:\workspace\test1\xml\web.xml"); 13 //获取节点 14 //List<Element> list=doc.selectNodes("/web-app/servlet/servlet-name");//servlet-mapping/url-pattern 15 //Element ele=list.get(0); 16 Element list=(Element) doc.selectSingleNode("//url-pattern"); 17 System.out.println(list.getText()); 18 } 19 20 }
反射:
1.获取对应的class对象
方式1:★
Class clazz=Class.forName("全限定名");
方式2:
Class clazz=类名.class;
方式3:
Class clazz==对象.getClass();
2.通过class对象创建一个实例对象(相当于 new 类())
Object clazz.newInstance();
3.通过class对象获取一个方法(public修饰的)
Method method=clazz.getMethod("方法名",Class .... paramType);
paramType为参数的类型
4.让方法执行:
method.invoke(Object 实例对象,Object ... 参数);
Object 实例对象:以前调用方法的对象 就是a
Object ... 参数:该方法运行时需要的参数 就是 10和30
执行这个方法 相当于
a.add(10,30);
例如:
method.invoke(a,10,30)
代码:
1 package com.uestc; 2 public class HelloMyServlet { 3 public void add(){ 4 System.out.println("空参add方法"); 5 } 6 7 public void add(int i,int j){ 8 System.out.println("带有连个add方法"); 9 System.out.println(i+j); 10 } 11 12 public int add(int i){ 13 return i+10; 14 } 15 }
1 package com.uestc.reflect; 2 3 import java.lang.reflect.Method; 4 5 import org.junit.Test; 6 7 8 import com.uestc.HelloMyServlet; 9 10 public class demo { 11 12 public void f1() 13 { 14 HelloMyServlet a=new HelloMyServlet(); 15 a.add(); 16 a.add(10, 5); 17 } 18 19 public void f2() throws ClassNotFoundException, InstantiationException, IllegalAccessException 20 { 21 Class clazz=Class.forName("com.uestc.HelloMyServlet"); 22 //通过字节码对象创建一个实例对象(相当于调用空参的构造器) 23 HelloMyServlet a=(HelloMyServlet) clazz.newInstance(); 24 a.add(); 25 } 26 @Test 27 public void f3() throws Exception 28 { //得到字节码对象 29 Class clazz=Class.forName("com.uestc.HelloMyServlet"); 30 //通过字节码对象创建一个实例对象(相当于调用空参的构造器) 31 HelloMyServlet a=(HelloMyServlet) clazz.newInstance(); 32 //获取方法对象 33 Method method=clazz.getMethod("add"); 34 //让方法对象执行 obj调用这个方法的实例,相当于a ,args是该方法执行时候所需要的参数 a.add() 35 method.invoke(a);//相当于 a.add() 36 } 37 38 public void f4() throws Exception 39 { 40 //获取class对象 41 Class clazz=HelloMyServlet.class; 42 //通过字节码对象创建一个实例对象(相当于调用空参的构造器) 43 HelloMyServlet a=(HelloMyServlet) clazz.newInstance(); 44 //获取有两个参数的add方法 45 Method m=clazz.getMethod("add", int.class,int.class); 46 //执行方法 47 m.invoke(a, 0,10); 48 49 } 50 }
xml约束:
作用:规定xml中可以出现那些元素及那些属性,以及他们出现的顺序.
约束的分类:
DTD约束:struts hiebernate等等
SCHEMA约束:tomcat spring等等
DTD约束:
和xml的关联 (一般都会提供好,复制过来即可,有时候连复制都不需要.)
方式1:内部关联
格式:
<!DOCTYPE 根元素名 [dtd语法]>
方式2:外部关联-系统关联
格式:
<!DOCTYPE 根元素名 SYSTEM "约束文件的位置">
例如:
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
方式3:外部关联-公共关联
格式:
<!DOCTYPE 根元素名 PUBLIC "约束文件的名称" "约束文件的位置">
dtd语法(了解)
元素:
<!Element 元素名称 数据类型|包含内容>
数据类型:
#PCDATA:普通文本 使用的时候一般用()引起来
包含内容:
该元素下可以出现那些元素 用()引起来
符号:
* 出现任意次
? 出现1次或者0次
+ 出现至少1次
| 或者
() 分组
, 顺序
属性:
格式:
<!ATTLIST 元素名 属性名 属性类型 属性是否必须出现>
属性类型:
ID:唯一
CDATA:普通文本
属性是否必须出现
REQUIRED:必须出现
IMPLIED:可以不出现
一个xml文档中只能添加一个DTD约束
xml的学习目标:
编写一个简单的xml文件
可以根据约束文件写出相应xml文件.
按f2或者 alt+/提示写出内容即可
SCHEMA约束
一个xml文档中可以添加多个schema约束
xml和schema的关联.
格式:
<根标签 xmlns="..." ...>
<根标签 xmlns:别名="..." ...>
名称空间:
关联约束文件
规定元素是来源于那个约束文件的
例如:
一个约束文件中规定 table(表格) 表格有属性 row和col
还有一个约束文件规定 table(桌子) 桌子有属性 width和height
在同一个xml中万一我把两个约束文件都导入了,
在xml中我写一个table,这个table有什么属性????
我们为了避免这种情况的发生,可以给其中的一个约束起个别名
使用的时候若是没有加别名那就代表是来自于没有别名的约束文件
例如 table(表格) 给他起个别名 xmlns:a="..."
在案例中使用 a:table 代表的是表格
若在案例中直接使用 table 代表的是桌子
在一个xml文件中只能有一个不起别名;
注意:
schema约束本身也是xml文件.