Java基础——XML理解、解析、导入、导出

为什么会有这个东西?

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属性值唯一。

  • 标签对中还可以定义文本内容。文本中如果用到需要转义的字符则需要转义,比如:&lt; (<)` 、&amp;(&)、` >(>)

  • 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包引入咱们的项目:
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);
    }

}

在这里插入图片描述
这样咱们就导出完成咯!
在这里插入图片描述
觉得博主可以的小伙伴记得给个一键三连哦!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值