XML是一种可扩展的标签语言:
什么是可扩展呢:可扩展代表着标签不是固定的,相对于HTML(超文本标签语言)只有那么几种固定的标签,XML可以自定义标签
经常看到的XML文件是这样的
<?xml version="1.0" encoding="UTF-8"?>
<web-app version = "1.0">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.tencent.fanshe.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.tencent.fanshe.HelloServlet</servlet-class>
</servlet-mapping>
</web-app>
其实XML还可以这样写:
<?xml version="1.0" encoding="UTF-8"?>
<a>
<b>
<d>我是b的d标签</d>
</b>
<c>
<d>我是c的d标签</d>
</c>
</a>
XML语法规则:
在XML文件的第一行必须写以下代码
<?xml version="1.0" encoding="UTF-8"?>
首先?XML代表这是一个XML文件,version代表xml遵循的规范,目前使用的是1.0,encoding代表编码方式
1.必须有根标签(所有的标签都在这个标签里面);
2.标签必须关闭,无论是<a></a>还是<a/>都可以
3.对大小写敏感,<a/> 和<A/>是不一样的
4.属性必须加引号,单引号双引号都可以。
5.空格不会被忽略,所以不要乱加空格
XML约束文件:
目前使用的约束文件有两种:DTD约束和SCHEMA约束
约束文件的作用是什么呢?
约束文件是为了进行程序间的数据交换而建立的关于标记符的语法规则。XML文档可根据某种约束文件的语法规则验证格式是否符合此规
则。不同的公司只需定义好标准文档类型定义,就都能依文档类型定义建立文档实例,并且进行验证,如此就可以轻易交换数据,防止了实例
数据定义不同等原因造成的数据交换障碍,满足了网络共享和数据交互。
如何使用XML约束文件?
系统关联方式:
在使用DTD约束文件时,需要在XML文档中加入以下代码
<!DOCTYPE web-app SYSTEM "web2_3.dtd">
其中web-app表示文档的根元素名,SYSTEM表示连接方式为系统关联,后面的“web2_3.dtd”是约束文件的路径。
公共关联方式:
格式如下:
<!DOCTYPE 根元素名 PUBLIC "约束文件的名称" "约束文件的位置">
在关联了约束文件之后我们就可以根据约束文件写XML文档了。
在编写XML文档时,关联了约束文件之后,按下键盘上的ALT + / 或F2可以选择添加到文档中的元素,鼠标停留在根元素上,就会提示类似以下信息
Element : web-app
Content Model : (servlet*, servlet-mapping*, welcome-file-list?)
element代表当前元素,Content Model括号里面表示包含的内容
* 表示出现任意次
? 出现1次或者0次
+ 出现至少1次
| 或者
() 分组
, 顺序,,=,表示表示
当我们不按照约束文档编写XML文件时,编写就会出现错误。
对于DTD约束,一个XML文档只能添加一个DTD约束
SCHEMA约束(SCHEMA约束也是XML文件):
一个XML文档中可以添加多个SCHEMA约束
XML和SCHEMA的关联.
格式:
<根标签 xmlns="..." ...>
<根标签 xmlns:别名="..." ...>
名称空间:
关联约束文件
规定元素是来源于那个约束文件的
XML解析:
解析的技术有dom4j, JDom, JAXP, jsoup(解析html)
解析方式;
1.sax解析 : 只能查询
2.dom解析:加载到内存中,形成一颗dom树,可以对dom树进行curd操作。
dom解析:
SAXReader reader = new SAXReader();
File file = new File("helloXML.xml");
assert file != null;
Document doc = reader.read(file);
Element ele = (Element) doc.selectSingleNode("/web-app/servlet/servlet-name");
String className = ele.getText();
利用xpath解析技术(依赖于dom4j)我们就对dom树进行了一次查询操作。
xpath解析技术:
使用步骤:
1.导入jar包(dom4j和jaxen-1.1-beta-6.jar)
2.加载xml文件到内存中
3.使用api
selectNode("表达式");
selectSingleNode("表达式");
表达式的写法:
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
例如一个标签下有一个id属性且有值 id=2;
//元素名[@属性名='属性值']
//元素名[@id='2']
案例(解析xml文档,获取servlet-class节点,并自动创建对象调用指定函数(反射)):
package com.baidu.example1;
import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader();
File file = new File("helloXML.xml");
if(file != null) {
try {
Document doc = reader.read(file);
Element ele = (Element) doc.selectSingleNode("/web-app/servlet/servlet-name");
String className = ele.getText();
Element ele1 = (Element) doc.selectSingleNode("/web-app/servlet/servlet-class");
String classAllName = ele1.getText();
map.put(className, classAllName);
System.out.println(map.get("HelloServlet"));
Class clazz = Class.forName(map.get("HelloServlet"));
Object obj = clazz.newInstance();
Method add1 = clazz.getMethod("add", int.class);
add1.invoke(obj, 1);
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
}
其中HelloServlet类有一个add(int)方法。