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();
}
}
}