加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML

发布时间:2020-12-16 05:39:03 所属栏目:百科 来源:网络整理
导读:在 web 编程阶段,我们可以实现浏览器通过地址访问服务器上的资源,但要想灵活实现不同的路径地址执行不同的服务器资源,就需要提到 xml 相关配置了。 XML的定义 可扩展的标记语言 。和 H tml 超文本标记语言相类似。标签也是成对出现的。 不同点: 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中配置好,浏览器就可以轻松访问需要的的资源啦。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读