XML介绍
XML全称: 可扩展标记语言(EXtensible Markup language)
XML作用: 用于数据的存储和传输
XML写法
创建一个文件其后缀名为.xml
第一行编写头信息:<?xml version="1.0" encoding="UTF-8" >
XML规则
结构良好性:标签对应 --> <xxx></xxx>
结构有效性:在结构良好的基础上遵循很多规则。如果想要让写完的xml遵循很多规则 需要单独再写一个xml文件--->用来描述规则(类似元注解的作用)
用来定义规则的也是一个xml形式的文件 xxx.dtd(规则标签) xxx.xsd(规则标签) xxx.tld(定义标签)
DTD规则
DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。
DTD使用
1.创建一个DTD规则文件,文件名为myxml.dtd 元素及描述参考代码内注释
W3C(https://www.w3school.com.cn/dtd/dtd_elements.asp)
<?xml version="1.0" encoding="UTF-8" ?>
<!--头标签 且必须是首行 用于说明其文件是一个dtd规范文件-->
<!-- 元素描述格式:
<!ELEMENT 元素名称 类别> -->
<!-- 描述school标签 class标示school标签内的子标签 *标示子标签可具有的数量-->
<!ELEMENT school (class*)>
<!ELEMENT class (teacher+,student*)>
<!ELEMENT teacher (sex,name)>
<!ELEMENT student (sex,name)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!-- 属性描述格式:
<!ATTLIST 元素名称
属性名称 属性类型 默认值
属性名称 属性类型 默认值
属性名称 属性类型 默认值
> -->
<!-- 属性名:id 属性类型:字符数据 默认值:属性不是必须的 -->
<!ATTLIST school
id CDATA #REQUIRED
name CDATA #IMPLIED
loc CDATA #IMPLIED
>
<!ATTLIST class
id CDATA #IMPLIED
name CDATA #IMPLIED
loc CDATA #IMPLIED
>
<!ATTLIST teacher
id CDATA #IMPLIED
name CDATA #IMPLIED
age CDATA #IMPLIED
>
<!ATTLIST student
id CDATA #IMPLIED
name CDATA #IMPLIED
age CDATA #IMPLIED
>
<!--定义实体
<!ENTITY 实体名称 "实体的值"> -->
<!ENTITY school "学校名字">
<!ENTITY class "班级名字">
<!ENTITY id "学号">
<!ENTITY name "名字">
2.创建一个XML文件用于实现上述规则。导入方式:<!DOCTYPE school SYSTEM "myxml.dtd">
<?xml version="1.0" encoding="UTF-8"?>
<!--头标签 且必须是首行 用于说明其文件是一个XML类型的文件-->
<!-- 导入刚才创建的dtd规则 -->
<!DOCTYPE school SYSTEM "myxml.dtd">
<school id="xxx" name="" loc="">
<class id="&class;" name="" loc="">
<teacher id="" name="" age="">
<sex></sex>
<name>&name;</name>
</teacher>
<student id="" name="" age="">
<sex></sex>
<name></name>
</student>
<student id="" name="" age="">
<sex></sex>
<name></name>
</student>
</class>
<class id="" name="" loc="">
<teacher id="" name="" age="">
<sex></sex>
<name></name>
</teacher>
<student id="" name="" age="">
<sex></sex>
<name></name>
</student>
</class>
</school>
注意:标签顺序需与创建时的顺序一致。
如:<!ELEMENT class (teacher+,student*)> 创建标签时:teacher标签需在student标签前(上方)
XML解析
本质就是文件内容的读取
XML解析的两种方式:
DOM解析(Document Object Model)
树结构处理方式
将文档全部解析 形成一个树结构 依次向下解析
优点 编程容易
缺点 必须将整个文档全部处理完毕(慢)
SAX解析(Simple Api for Xml)-----扩展
类似流媒体方式
基于事件的模式 解析时候触发一系列事件
当某一个tag标签被解析的时候 激活后续的方法
优点 快(不需要将所有文档都一次性处理完)
缺点 编写很麻烦(复用性也不强)
DOM解析
通过org.w3c.dom.*包下的Document,Element,NodeList三个类来解析XML文件。
调用的方法:
document.getDocumentElement();//获取根标签对象(school)
school.getAttribute("id");//获取school标签中的属性
NodeList classList = school.getElementsByTagName("class");//school标签中的子标签
classList.getLength();//获取classList长度
classList.item(num);//获取classList中某个值
package testDtd;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
@SuppressWarnings("all")
public class TestDom {
public static void main(String[] args) {
try {
//采用DOM方式 Document Object Model
//1.需要一个工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.利用工厂创建工人
DocumentBuilder builder = factory.newDocumentBuilder();
//3.工人创建一个document对象(需要一张图纸 xml文件)
File file = new File("src/testDtd/school.xml");
//InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("testxml/school.xml");
Document document = builder.parse(file);
//4.解析xml文件
//获取根标签对象(school)
//方式一
Element school = document.getDocumentElement();
//方式二
// Element school = document.getElementById("duyi");//需要有dtd规则
//方式三
// NodeList RootList = document.getElementsByTagName("school");
// Element school = RootList.item(0);// list.get(0);
//获取school标签中的属性
String schoolID = school.getAttribute("id");
String schoolName = school.getAttribute("name");
String schoolLOC = school.getAttribute("loc");
System.out.println(schoolID+"--"+schoolName+"--"+schoolLOC);
//school标签中的子标签
//方式一
// NodeList classList = document.getElementsByTagName("class");
//方式二
NodeList classList = school.getElementsByTagName("class");
//方式三
// NodeList classList = school.getChildNodes();//需要有dtd规则
for(int i=0;i<classList.getLength();i++){
//某一个class标签
Element classEle = (Element)classList.item(i);
String classID = classEle.getAttribute("id");
String className = classEle.getAttribute("name");
String classLOC = classEle.getAttribute("loc");
System.out.println("\t"+classID+"--"+className+"--"+classLOC);
//class标签的子标签teacher
//方式一
Element teacher = (Element)classEle.getElementsByTagName("teacher").item(0);
//方式二
// Element teacher = (Element)classEle.getFirstChild();//需要有dtd规则
String teacherID = teacher.getAttribute("id");
String teacherName = teacher.getAttribute("name");
String teacherAge = teacher.getAttribute("age");
Element teacherSexEle = (Element)teacher.getElementsByTagName("sex").item(0);
String teacherSex = teacherSexEle.getTextContent();
System.out.println("\t\t"+teacherID+"--"+teacherName+"--"+teacherAge+"--"+teacherSex);
//class标签中的子标签student
NodeList studentList = classEle.getElementsByTagName("student");
for(int j=0;j<studentList.getLength();j++){
Element student = (Element)studentList.item(j);
String studentID = student.getAttribute("id");
String studentName = student.getAttribute("name");
String studentAge = student.getAttribute("age");
Element sex = (Element)student.getElementsByTagName("sex").item(0);
String studentSex = sex.getTextContent();//获取标签中的文本内容<>xxx</>
System.out.println("\t\t"+studentID+"--"+studentName+"--"+studentAge+"--"+studentSex);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
JDOM解析
基于DOM解析优化后的一种解析方式
需导入第三方 .jar 包使用
package testDtd;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import java.io.File;
import java.util.List;
public class TestJDOM {
public static void main(String[] args){
try {
System.out.println("以JDOM形式进行解析 需要一个jdom.jar外部包");
//获取builder对象 自己创建
SAXBuilder builder = new SAXBuilder();
File file = new File("src/testDtd/school.xml");
//工人创建document对象
Document document = builder.build(file);
//读取school.xml中的根标记 school
Element school = document.getRootElement();
//获取school标签中的属性
String schoolID = school.getAttributeValue("id");
String schoolName = school.getAttributeValue("name");
String schoolLOC = school.getAttributeValue("loc");
System.out.println(schoolID+"--"+schoolName+"--"+schoolLOC);
//获取school标记的子元素 好几个class
List<Element> classList = school.getChildren("class");
for(Element classEle : classList){
//获取classEle中的属性
String classID = classEle.getAttributeValue("id");
String className = classEle.getAttributeValue("name");
String classLOC = classEle.getAttributeValue("loc");
System.out.println("\t"+classID+"--"+className+"--"+classLOC);
//获取class中的子元素 teacher
Element teacher = classEle.getChild("teacher");
String teacherID = teacher.getAttributeValue("id");
String teacherName = teacher.getAttributeValue("name");
String teacherAge = teacher.getAttributeValue("age");
Element teacherSexEle = teacher.getChild("sex");
String teacherSex = teacherSexEle.getText();
System.out.println("\t\t"+teacherID+"--"+teacherName+"--"+teacherAge+"--"+teacherSex);
//获取class中的子元素 好多student
List<Element> studentList = classEle.getChildren("student");
for(Element student : studentList){
String studentID = student.getAttributeValue("id");
String studentName = student.getAttributeValue("name");
String studentAge = student.getAttributeValue("age");
String studentSex = student.getChildText("sex");
System.out.println("\t\t"+studentID+"--"+studentName+"--"+studentAge+"--"+studentSex);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
DOM4J解析
基于JDOM解析优化后的一种更新
需导入第三方 .jar 包使用
package testDtd;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class TestDOM4J {
public static void main(String[] args) {
try {
System.out.println("利用DOM4J形式解析 需要以来外部dom4j.jar");
//创建一个解析对象
SAXReader reader = new SAXReader();//理解为是之前的builder对象
//提供一个文件
File file = new File("src/testDtd/school.xml");
//让解析对象读取file并产生一个document对象
Document document = reader.read(file);
//获取根元素
Element school = document.getRootElement();
//获取school中的属性
String schoolID = school.attributeValue("id");
String schoolName = school.attributeValue("name");
String schoolLOC = school.attributeValue("loc");
System.out.println(schoolID+"--"+schoolName+"--"+schoolLOC);
//获取school中的子元素 class
List<Element> classList = school.elements("class");
for(Element classEle : classList){
//获取class中的属性
String classID = classEle.attributeValue("id");
String className = classEle.attributeValue("name");
String classLOC = classEle.attributeValue("loc");
System.out.println("\t"+classID+"--"+className+"--"+classLOC);
//获取class中的子元素(一个teacher)
Element teacher = classEle.element("teacher");
String teacherID = teacher.attributeValue("id");
String teacherName = teacher.attributeValue("name");
String teacherAge = teacher.attributeValue("age");
Element teacherSexEle = teacher.element("sex");
String teacherSex = teacherSexEle.getText();
System.out.println("\t\t"+teacherID+"--"+teacherName+"--"+teacherAge+"--"+teacherSex);
//获取class中的子元素(好多student)
List<Element> studentList = classEle.elements("student");
for(Element student : studentList){
String studentID = student.attributeValue("id");
String studentName = student.attributeValue("name");
String studentAge = student.attributeValue("age");
String studentSex = student.elementText("sex");
System.out.println("\t\t"+studentID+"--"+studentName+"--"+studentAge+"--"+studentSex);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
.jar下载地址:https://download.csdn.net/download/qq_41983207/16680381