XML

    在web编程阶段,我们可以实现浏览器通过地址访问服务器上的资源,但要想灵活实现不同的路径地址执行不同的服务器资源,就需要提到xml相关配置了。


XML的定义

可扩展的标记语言。和Html超文本标记语言相类似。标签也是成对出现的。

不同点:xml中可以自定义标签名,要区分大小写,要顶格写。

因为1.1版本的兼容性差,所以我们使用的是1.0版本的xml


XML的作用

1、编写配置文件:实现浏览器和服务器的交互

2、存放数据:通过一定的规范,存放数据,达到多平台共享数据的目的。

 

XML语法

1、文档声明<? Xml version="1.0"encoding="utf-8" ?>

2、元素:开始标签标签体结束标签

<A><B>你好</B></A>

!!!必须只有一个根标签

3、属性

属性是元素的一部分,必须出现在开始标签中,属性名=属性值

可以有多个但是不能同名

4、注释

<!--注释内容-->

5、转义符:在xml中有很多符号已经被文档结构使用,这是元素体或者元素属性想使用这些符号的时候就需要进行转移。

&--&amp

>--&gt

<--&lt

"--&auto

'--&apos

CDATA区:书写大量的需要转移的符号,这样就无需我们一一进行转义,提高代码的可读性。

<script>

<![CDATA[

<>?>?>?><><><><><>

]]>

</script>

 

XML中的约束

    xml虽然我们可以自己定义标签,但是如果我们各自一种定义,大家沟通起来难免太过于困难,因此我们要遵循一种大家约定俗成的规范来统一编写XML,这样阅读起来就方便多了,还可以共享。一般约束都是写好的,我们拿来用就可以,需要不同的约束即便引入不同的约束即可。

1、DTD约束

<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">

注意:,表示按照规定的属性添加标签体或属性;  ?代码0-1次; +代表1到多次;  *代表0-多次;PCDATA表示文本。


2、Schema约束

<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">
</web-app>
注意:命名空间:防止引入多个schema约束存在相同名称无法辨别。

缺省:xmlns="名称"

声明:xmlns:别名="名称"

xmlns="http://www.example.org/demo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


XML解析

通过程序获得xml中的内容

解析方式分类

1、DOM:将整个xml中的文档加载到内存中,解析成document对象。

    优点:元素与元素之间保留结构关系,能够进行增删改查操作;

    缺点:当xml文档过大会造成内存溢出。

2、SAX:将文档进行逐行扫描,事件驱动的方式进行解析。

    优点:速度快,效率高;

    缺点:只能读,逐行读完将释放,不能再找回来。

3、PULL:Android内置的解析方式。

DOM解析原理

采用dom4j解析工具包。通过核心类SaxReader获得document对象;然后由document对象得到根元素;再进行一系列操作。

dom解析---中心思想是元素

public static void main(String[] args) throws Exception {
		 //1、核心类
		SAXReader reader = new SAXReader();
				//类加载器
		 InputStream is = Dom.class.getClassLoader().getResourceAsStream("web.xml");
		 //2、获得document对象
		 Document document = reader.read(is);
		 //3、获得根元素
		 Element rootElement = document.getRootElement();
		 String value = rootElement.attributeValue("version");
		 System.out.println(value);
		 //获得所有元素
		List<Element> list= rootElement.elements();
		for (Element ele : list) {
			if("servlet".equals(ele.getName())){
				Element servletName = ele.element("servlet-name");
				System.out.println(servletName.getText());
			}
		}
	}
xpth解析---中心思想是节点

                 SAXReader saxReader = new SAXReader()
		 InputStream is = Xpath.class.getClassLoader().getResourceAsStream("web.xml");
		 Document document = saxReader.read(is);
		 
		 Node node = document.selectSingleNode("//servlet-name");//@表示属性;/表示根目录;//表示任意目录开始
		 System.out.println(node);
		 //转换成元素
		 Element ele=(Element)node;
		 System.out.println(ele.getText());

模拟浏览器访问服务器

public static void main(String[] args) throws Exception {
		//map集合中存放---浏览器中要输入的预定义的数据和相应的路径
		Map<String, String> map=new HashMap<String, String>();
		//核心类---加载xml文件
		//通过反射获得流对象  SAXReader解析读取文件得到document对象
		InputStream is = ReflectandXML.class.getClassLoader().getResourceAsStream("web.xml");
		SAXReader saxReader=new SAXReader();
		Document document = saxReader.read(is);
		//document得到根元素
		Element rootEle = document.getRootElement();
		//得到根元素下的子元素
		List <Element>list = rootEle.elements();
		//遍历
		for (Element ele : list) {
			//判断servlet存放在map中
			if("servlet".equals(ele.getName())){
				String servletName = ele.elementText("servlet-name");//abc
				String servletClass = ele.elementText("servlet-class");//com.itheima.b_reflect.Hello
				map.put(servletName, servletClass);
			}
			//判断servlet-mapping下一个标签
			if("servlet-mapping".equals(ele.getName())){
				String servletName = ele.elementText("servlet-name");//abc
				String urlPattern=ele.elementText("url-pattern");//    /Hello浏览器输入的路径
				//因为两个标签的servletName是相同的,根据servletName得到map中的真正路径
				String servletClass = map.get(servletName);
				//将浏览器输入的路径和真正的路径存在map中
				map.put(urlPattern, servletClass);
				//将第一次存放在map中数据删除,此时map中存放的正是解析后获得的数据----浏览器输入的路径和真正的路径
				map.remove(servletName);
			}
			
		}
		
		//模拟浏览器端---假设传入路径
		String path="/Hello";
		//从map中得到真正的路径下的类
		String servletPath = map.get(path);
		//反射得到Class对象
		Class clazz = Class.forName(servletPath);
		//实例化对象
		Object object = clazz.newInstance();
		//调用方法
		clazz.getMethod("init").invoke(object);
	}

    总结:这就是通过解析xml获得浏览器访问地址的决定路径的过程,但以后我们无需手动解析,在服务器创建Servlet会自动在web.xml中配置好,浏览器就可以轻松访问需要的的资源啦。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值