XML是一种k可扩展的标记语言,主要用于数据交换。它主要是由于以前各大浏览器之间的恶意竞争,都在用自己公司定义的语法来书写代码,这与W3C公司的初衷相违背。于是W3C才制定了XML标准,用来替代HTML进行数据交替。可惜,想法是好的,但是并不能吸引消费者,XML的最初目的就失败了,于是XML选择了第二条路,向数据交互方向寻求生存之路,也就是现在它的具体功能。用来作配置文件和网络中的数据交互。
它们的区别主要分为以下三点:
1. XML标签都是用户自定义的,而HTML的标签都是预定义(相当于每个标签都已经帮你实现了一个基础功能)的。
2. XML的语法严格,HTML语法松散.HTML中语句可以杂乱无章,但XML中不行,必须完全规范化。
3. XML存储数据,HTML展示数据。
1. - XML文件的后缀必须都是xml
2. XML第一行必须写文档声明
3. XML中有且仅有一个根标签
4. 属性值必须使用引号,单引号、双引号都可以
5. 标签必须正确关闭,要么成对标签,要么自闭合
6. XML区分大小写
文档声明:
<?xml version="1.0" encoding="UTF-8"?> ,version表示版本号,是必须属性(必须要写),encoding设置版本号
Xml中也可以定义指令(CSS),不过现在都不会这么写,都是使用html来完成的,所以这个大家了解有这个功能就好咯!
XML中标签都是自定义的,但是它有着严格的定义规则:
标签中可以定义属性,主要以健值对的形式存在(Key -Value)。属性值必须使用引号,单引号、双引号都行。id属性值唯一。
标签对中还可以定义文本内容。文本中如果用到需要转义的字符则需要转义,比如:< (<)
` 、&(&)
、` >(>)
CDATA区中的文本会原样输出,特殊字符不需要转义。`<![CDATA[ ]]>
<code> <![CDATA[ if(a>1 && a<3){ } ]]> </code>
XML中主要是做数据交互的,那么我们可以通过规则对这些数据进行约束。
XML的约束主要分为dtd跟schema两种。dtd是一种简单的约束技术,已经过时。schema是一种复杂的约束技术,功能更加强大。
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程序员来说用的不多的。
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的基本规则
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
指定要使用的schema文件(student.xsd
),并且给这个文件取一个别名http://www.xiaodu n.com/xml
xmlns:命名空间
给这个别名命名一个命名空间的前缀,定义了前缀以后标签需要加上前缀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,主要的解析方式有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的解析,那有解析咱们就还需要创建。
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); } }
这样咱们就导出完成咯!
觉得博主可以的小伙伴记得给个一键三连哦!!!