Web08:XML

XML是什么?可扩展的标记语言。与HTML相似,但是HTML的标签是固定的,而XML的标签是用户自定义的。

可能用到的文件>>>

提取码:cc2i 

开头放项目结构

先贴一个图,然后讲解语法

XML的语法

文档声明

就是最开头的那一行,且必须放在第一行。

<?xml version="1.0" encoding="UTF-8"?>

元素Element

比如说

<servlet>

就是元素

元素命名又有规范,区分大小写,不使用空格,不能使用冒号,最好别用XML,xml,Xml开头。

属性

比如

<web-app version="2.5">

其中的version就是属性,2.5是属性值。属性名不能使用空格,冒号,使用字母开头。

注释

<!--注释内容-->,就这个东西。

转义字符

CDATA区

为了提高阅读性,减少转义字符。就是说,在里边不用转义字符,直接就写。

不用CDATA区时

<?xml version="1.0" encoding="UTF-8"?>
<aaa>
	<aaa-name>
		&lt; 大家好  &gt;
	</aaa-name>
</aaa>

用CDATA区时

<?xml version="1.0" encoding="UTF-8"?>
<aaa>
	<aaa-name>
		<![CDATA[
			我直接使用<><><><><><>
		]]>
	</aaa-name>
</aaa>

自定义的XML

<?xml version="1.0" encoding="UTF-8"?>
<aaa>
    <aaa-text>这是一个没有约束的xml文件,我们可以随意书写</aaa-text>
    <!--这是注释,我们在下边存放数据-->
    <person id="data">
        <name>张三</name>
    </person>
    <!--这是注释,我们在下边配置文件-->
    <test>
        <test-name>&it;Test</test-name>
        <test-class>com.xx.test.Test</test-class>
    </test>
</aaa>

在上边的代码中,我们可以随意的书写。不用像HTML那样,标签固定,你必须写<head></head>这样的。但是完全的自定义,有时也是坏事,因为你有时不知道写什么。因此出现了约束

下面介绍两种约束,DTD与Schema。

DTD约束:Document Type Definition 文档类型定义

一般当我们使用框架时,都是ctrl c 框架提供的头文件,我们并不用怎么了解DTD具体是怎么写的。

我使用的dtd文件也放到了文章开头的链接里了。

文档声明

内部DTD

只对当前xml文档有效,因为我们一般使用框架提供的DTD,所以一般不用.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app[
	具体语法
]>
<web-app></web-app>

外部DTD--本地DTD

一般公司内部项目使用,文档在本地系统上。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app></web-app>

外部DTD--公共DTD

一般由框架提供,文档在公网上

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "http://java.sun.com/dtdweb-app_2_3.dtd">
<web-app></web-app>

元素声明

主要是了解一下? * + () | , 这些东西。要问这是啥?其实当你依据DTD约束写XML文件时,我们通过看前边说的那几个符号来考虑要不要写某个标签,有点解释不清楚,我上一张图吧!其实跟正则表达式差不多的概念!

然后,我们要在什么时候用呢?比如现在图中有错误,

错误提示

我给写出来

The content of element type "servlet" is incomplete, it must match "(servlet-name,description?,
 (servlet-class|jsp-file))".

我们可以看出,提示上说我们还需要在<servlet>里边写一些标签才可以,具体写什么呢?后边就用到了我们刚刚学的

(servlet-name,description?,(servlet-class|jsp-file)),解释一下就是我们需要写一个servlet-name标签,0个或者1个description标签,1个servlet-class或者1个jsp-file标签。这就是约束的意义,它可以提示你还需要写什么。当你不知道要写什么的时候,就把指针放到上一级的标签名上就可以知道了,不管标签是不是提示错误.

比如现在我只写了一个web-app标签,它没有提示错误,而我们也不知道接下来怎么写了,我们把指针放到标签上。


 

Element : web-app
Content Model : (servlet*, servlet-mapping*, welcome-file-list?)

通过提示,我们就知道接下来写什么了!

Schema约束

比DTD强,扩展名为xsd,支持命名空间

这里只是说明一下怎么用,如有需要在自行学习!

我使用的xsd文件也放到了文章开头的链接里了

你只需要将xsd文件中的xml文件开头复制到自己创建的xml文件中,然后依据约束书写xml文档就可以了

先介绍一下默认命名空间和显示命名空间

xmlns:默认命名空间,xmls:xsi:显示命名空间

这些东西一般框架文档里都会有,我们直接拷贝就可以了!

Dom4j解析:

看完上边的对于xml与约束的解释,现在我们要把xml文件用到我们的Java代码中。如何用呢?IO?太痛苦了!

爱偷懒的程序员就写了这个东西:Dom4j来偷懒

解析方式

操作xml文件,需要我们解析。而解析方式分为三种:

DOM:将整个XML文档放入内存,解析成一个Document对象,保留结构关系,可以增删改查。但可能会内存溢出。

SAX:一边扫描文档,一边解析。速度快,但只能读。

PULL:Android内置解析xml方式。

解析器

常用的:

  1. JAXP:支持Dom与SAX解析方式
  2. JDom:Dom4j兄弟
  3. jsoup:解析特定HTML
  4. Dom4j:常用

说完这些,正式开始撸代码。跟上一篇博文一样,记住核心类SAXReader,这里我们使用Dom4j来解析用Schema约束来书写的那个xml文档

再次解释一遍,整体的意思就是使用web-app_2_5.xsd这个约束来约束SchemaXml.xml文件然后我们要通过Java代码得到xml文档中的某些标签里的值!如何通过Java代码获得值呢?本来是用IO流,现在用Dom4j来更加轻松的获取值。使用Dom4j要用到Jar包,在文章开头的链接中有Jar包,就下图这两个。

撸代码!

/**
 * 
 */
package com.yl.xml.test;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

/**
 * @author YL
 * @date 2019年2月28日
 * @version  
 * @message 测试XML:Dom4j
 */
public class TestXML {
	/**
	 *  使用Dom4j对schema约束的xml的导入
	 */
	@Test
	public void loadSchema() {
		// TODO Auto-generated method stub
		try {
			//获得Document文档
			SAXReader sr = new SAXReader();
//			从这里可以切换使用那个xml文件
			Document dom = sr.read(new File("src/com/yl/xml/schema/SchemaXml.xml"));
			//获得根元素
			Element rootElement = dom.getRootElement();
			//获得所有的子元素
			List<Element> elements = rootElement.elements();
			for(Element elem : elements){
				System.out.println("根目录下的所有子元素的Name:"+elem.getName());
				if("servlet".equals(elem.getName())){
					Element element = elem.element("servlet-name");
					System.out.println("servlet-name内容:"+element.getText());
				}
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

收工!

猜你喜欢

转载自blog.csdn.net/qq_38827988/article/details/88048362