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>
< 大家好 >
</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>⁢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方式。
解析器
常用的:
- JAXP:支持Dom与SAX解析方式
- JDom:Dom4j兄弟
- jsoup:解析特定HTML
- 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();
}
}
}
收工!