为什么会有这个东西?
XML是一种k可扩展的标记语言,主要用于数据交换。它主要是由于以前各大浏览器之间的恶意竞争,都在用自己公司定义的语法来书写代码,这与W3C公司的初衷相违背。于是W3C才制定了XML标准,用来替代HTML进行数据交替。可惜,想法是好的,但是并不能吸引消费者,XML的最初目的就失败了,于是XML选择了第二条路,向数据交互方向寻求生存之路,也就是现在它的具体功能。用来作配置文件和网络中的数据交互。
XML和HTML的区别
它们的区别主要分为以下三点:
1. XML标签都是用户自定义的,而HTML的标签都是预定义(相当于每个标签都已经帮你实现了一个基础功能)的。
2. XML的语法严格,HTML语法松散.HTML中语句可以杂乱无章,但XML中不行,必须完全规范化。
3. XML存储数据,HTML展示数据。
XML语法规则
1. - XML文件的后缀必须都是xml
2. XML第一行必须写文档声明
3. XML中有且仅有一个根标签
4. 属性值必须使用引号,单引号、双引号都可以
5. 标签必须正确关闭,要么成对标签,要么自闭合
6. XML区分大小写
XML组成
文档声明:
<?xml version="1.0" encoding="UTF-8"?> ,version表示版本号,是必须属性(必须要写),encoding设置版本号
Xml中也可以定义指令(CSS),不过现在都不会这么写,都是使用html来完成的,所以这个大家了解有这个功能就好咯!
XML中标签都是自定义的,但是它有着严格的定义规则:
- 名称可以包含字母,数字以及其它字符
- 不能以数字或者标点符号开头
- 名称不能以xml或者XML、Xml等等开始
- 名称不能包含空格**
标签中可以定义属性,主要以健值对的形式存在(Key -Value)。属性值必须使用引号,单引号、双引号都行。id属性值唯一。
-
标签对中还可以定义文本内容。文本中如果用到需要转义的字符则需要转义,比如:
< (<)
` 、&(&)
、` >(>) -
CDATA区中的文本会原样输出,特殊字符不需要转义。`<![CDATA[ ]]>
<code>
<![CDATA[
if(a>1 && a<3){
}
]]>
</code>
XML中主要是做数据交互的,那么我们可以通过规则对这些数据进行约束。
XML的约束主要分为dtd跟schema两种。dtd是一种简单的约束技术,已经过时。schema是一种复杂的约束技术,功能更加强大。
DTD的使用
DTD有两个引入方式,外部引用和内部引用。具体上代码:首先咱们创建一个XML文件,编写如下代码:
<?xml version="1.0" encoding="UTF-8"?>
<Students>
<student number = "a1">
<name>xiaodun</name>
<age>18</age>
<sex>男</sex>
</student>
</Students>
随后咱们再添加dtd文件(大家记得先创建文件哈~),用来约束xml中的数据:
<!-- 定义可以有标签Students,可以有student子标签,*表示数量为0-N, +表示1-N -->
<!ELEMENT Students (student+) >
<!-- 定义有标签student,可以有name,age,sex子标签,需要满足顺序 -->
<!ELEMENT student (name,age,sex) >
<!-- 定义可以有标签name,类型为字符串-->
<!ELEMENT name (#PCDATA) >
<!-- 定义可以有标签age,类型为字符串-->
<!ELEMENT age (#PCDATA) >
<!-- 定义可以有标签sex,类型为字符串-->
<!ELEMENT sex (#PCDATA) >
<!-- 定义student标签可以有属性number,必填项-->
<!ATTLIST student number ID #REQUIRED >
随后在xml文件中引入dtd文件:
这儿就通过外部引入的方式成功引入咱们的dtd文件咯,内部的也很简单:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Students [
<!-- 定义可以有标签Students,可以有student子标签,*表示数量为0-N, +表示1-N -->
<!ELEMENT Students (student+) >
<!-- 定义有标签student,可以有name,age,sex子标签,需要满足顺序 -->
<!ELEMENT student (name,age,sex) >
<!-- 定义可以有标签name,类型为字符串-->
<!ELEMENT name (#PCDATA) >
<!-- 定义可以有标签age,类型为字符串-->
<!ELEMENT age (#PCDATA) >
<!-- 定义可以有标签sex,类型为字符串-->
<!ELEMENT sex (#PCDATA) >
<!-- 定义student标签可以有属性number,必填项-->
<!ATTLIST student number ID #REQUIRED >
]>
<Students>
<student number = "a1">
<name>xiaodun</name>
<age>18</age>
<sex>男</sex>
</student>
</Students>
其实咱们主要是了解就好咯,这些知识对java程序员来说用的不多的。
由于DTD不能对数据内容进行约束,我们使用功能更加强大的技术:schema。
schema的基本使用
<?xml version="1.0" encoding="UTF-8"?>
<a:students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<a:student number="blb_0001">
<a:name>six</a:name>
<a:age>111</a:age>
<a:sex>boy</a:sex>
</a:student>
</a:students>
schema的基本规则
- schema文件的后缀是xsd。
- schema的导入信息都是写在根标签中的。
- 在根标签中需要引入xsi的前缀
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 通过
xsi:schemaLocation
指定要使用的schema文件(student.xsd
),并且给这个文件取一个别名http://www.xiaodu n.com/xml
- 通过
xmlns:命名空间
给这个别名命名一个命名空间的前缀,定义了前缀以后标签需要加上前缀 - 可以不设置命名空间,则标签默认来自此xsd文件,如果有多个schema文件,只能有1个默认。
schema的定义
<?xml version="1.0" ?>
<xsd:schema xmlns="http://www.blb.com/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.xiaodun.com/xml" elementFormDefault="qualified">
<!-- 定义标签students 类型是自定义类型studentsType -->
<xsd:element name="students" type="studentsType" />
<xsd:complexType name="studentsType">
<xsd:sequence>
<!-- 标签student,类型是自定义类型studentType 最少出现次数是1,最多次数不限 -->
<xsd:element name="student" type="studentType" minOccurs="1"
maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<!-- 定义自定义类型studentType -->
<xsd:complexType name="studentType">
<xsd:sequence>
<!-- name标签是字符串类型 -->
<xsd:element name="name" type="xsd:string" />
<!-- age标签是自定义类型ageType -->
<xsd:element name="age" type="ageType" />
<!-- sex标签是自定义类型sexType -->
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<!-- 属性number,类型是自定义类型numberType,且为必须的 -->
<xsd:attribute name="number" type="numberType" use="required" />
</xsd:complexType>
<!-- sexType自定义类型 -->
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<!-- 枚举:值只能是boy或者girl -->
<xsd:enumeration value="boy" />
<xsd:enumeration value="girl" />
</xsd:restriction>
</xsd:simpleType>
<!-- 自定义类型ageType 范围从0-300之间 -->
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0" />
<xsd:maxInclusive value="300" />
</xsd:restriction>
</xsd:simpleType>
<!-- 自定义numberType类型,必须以xiaodun_开头,后面跟4位数字 -->
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="xiaodun_\d{4}" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
对于schema的语法不需要掌握,了解如何使用即可。
XML解析
定义好的xml文件我们通常需要使用程序来操作,这就要求我们能够解析XML,主要的解析方式有DOM、SAX。DOM主要基于文档对象模型,操作方便,相对更占空间。SAX基于事件驱动。我们通常使用框架dom4j来解析。
dom4j包在网上都是可以找到的哈,有需要的也可以私信我~ 首先将dom4j包引入咱们的项目:
随后我们需要先创建一个xml文件,并给它添加一些初始内容(方便解析显示):
<?xml version="1.0" encoding="utf-8" ?>
<class>
<student>
<firstname>cxx1</firstname>
<lastname>Bob1</lastname>
<nickname>stars1</nickname>
<marks>85</marks>
</student>
<student rollno="493">
<firstname>cxx2</firstname>
<lastname>Bob2</lastname>
<nickname>stars2</nickname>
<marks>85</marks>
</student>
<student rollno="593">
<firstname>cxx3</firstname>
<lastname>Bob3</lastname>
<nickname>stars3</nickname>
<marks>85</marks>
</student>
</class>
这是给xml文件添加的初始内容,现在咱们开始解析:
package com.dun.demo;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
/**
* @ClassName Demo3
* @Description Xml文件解析
* @Date 2021/4/22、21:12
**/
public class Demo3 {
public static void main(String[] args) throws DocumentException {
//获取dom4j提供的读取方法
SAXReader saxReader = new SAXReader();
//加载咱们写的XML文件
Document read = saxReader.read("C:/Users/XiaoDun/Desktop/a.xml");
//获取根节点
Element rootElement = read.getRootElement();
//获取迭代器,遍历跟节点。找到跟节点下的属性。
Iterator<Element> elementIterator = rootElement.elementIterator();
while (elementIterator.hasNext()){
Element next = elementIterator.next();
//打印跟节点下的属性
System.out.println(next。getStringvalue());
}
}
}
第一次遍历发现找到的子节点内容都是带着格式的,那我们可以接着遍历每一个子节点:
package com.dun.demo;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
/**
* @ClassName Demo3
* @Description Xml文件解析
* @Date 2021/4/22、21:12
**/
public class Demo3 {
public static void main(String[] args) throws DocumentException {
//获取dom4j提供的读取方法
SAXReader saxReader = new SAXReader();
//加载咱们写的XML文件
Document read = saxReader.read("C:/Users/XiaoDun/Desktop/a.xml");
//获取根节点
Element rootElement = read.getRootElement();
//获取迭代器,遍历跟节点。找到跟节点下的属性。
Iterator<Element> elementIterator = rootElement.elementIterator();
while (elementIterator.hasNext()) {
Element next = elementIterator.next();
Iterator<Element> elementIterator1 = next.elementIterator();
while (elementIterator1.hasNext()){
Element next1 = elementIterator1.next();
//打印子节点下的每一个属性
System.out.println(next1.getStringValue());
}
}
}
}
这就是咱们XML的解析,那有解析咱们就还需要创建。
XML文档创建
package com.dun.demo;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName Demo2
* @Description 文档的创建
* @Date 2021/4/22、18:42
**/
public class Demo2 {
public static void main(String[] args) throws IOException {
//创建根节点
Element element = DocumentHelper.createElement("企业名单");
//创建文档
Document document = DocumentHelper.createDocument(element);
//添加属性
element.addAttribute("地区","湖北");
//添加子节点
Element name = element.addElement("名字");
Element sex = element.addElement("性别");
Element age = element.addElement("年龄");
//为子节点添加内容
name.addText("小佳");
sex.addText("男");
age.addText("32");
//输出到命令行
XMLWriter xmlWriter = new XMLWriter();
xmlWriter.write(document);
//输出到硬盘
OutputFormat outputFormat = new OutputFormat(" ", false);
XMLWriter xmlWriter1 = new XMLWriter(new FileOutputStream("C:/Users/XiaoDun/Desktop/a.xml"));
xmlWriter1.write(document);
}
}
这样咱们就导出完成咯!
觉得博主可以的小伙伴记得给个一键三连哦!!!