XML之DTD规则和DOM解析、JDOM、DOM4J
2019-10-04 本文已影响0人
_FireFly_
详细的XML之DTD规则在https://www.w3school.com.cn/
文本文档 .txt
配置文件 .properties
想要解析文件 读取文件中的内容 Input
HTML
Hyper Text Markup Language
超级文本标记(标签)语言
出现这个语言的目的 服务器给浏览器发送响应信息
浏览器懂这个规则 解析语言---->进行展示
XML
EXtensible Markup Language
可扩展标记(标签)语言
创建这个XML的宗旨不是为了HTML进行扩展 关注的非展示
更多的是关注数据的存储和传输---->关注的是数据存储和传输
1.写法
创建一个文件 .xml
建议在文件的第一行 头信息
<?xml version="1.0" encoding="UTF-8" >
2.规则
结构良好的 有规则 标签对应 <xxx></xxx>
结构有效的 在结构良好的基础上遵循很多规则(写什么标签 名字叫什么 属性叫什么 几个 顺序)
如果想要让写完的xml遵循结构有效的
需要单独再写一个xml文件--->用来描述规则(类似元注解的作用)
.tld Tag Library Definition 用来描述标签的
.dtd Document Type Difinition 文档类型描述
.xsd Xml Schema Definition 用来描述xml文档内容
.xml eXtensible Markup Language 用来存储数据的文档
3.基本xml文件写法
为了让xml文件中的内容遵循某些规则
自定义dtd
第一可以写在当前的xml文件中
第二可以写在一个外部的文件中 引入
描述根标记
<!DOCTYPE school [规则]>
描述根标记中的其他标记<标签>
<!ELEMENT 元素名 类别|(元素里面的内容) >
类别 通常是EMPTY
元素内容 (其他标签,其他标签)
标签内部没有标签 是普通的文字 PCDATA
PCDATA Parsed Character DATA(通常用来描述标签中间的文字<>xxx<>)
可以被解析的字符数据 支持实体 &xxx;
>大于 <小于 &与符号 "双引号 '单引号
正常情况下 描述标签内部的子标签时候 默认认为是一个
还需要在子标签基础上增加一个 对于个数的说明
*符号 0-n个 ?符号 0-1个 +符号 1-n个
,符号 都有 |符号 a或b其中的一个
每一个标记中还需要有属性
<!ATTLIST> attribute list
<!ATTLIST 标签名 属性名 什么类型 值>
通常类型的描述
CDATA Character DATA 原封不动 (通常用来描述属性名)
(t1|t2|t3) 来描述
通常值的描述
默认值 "xxx"
值的说明 (是否是必须 固定的。。)
#REQUIRED必须 #IMPLIED非必需 #FIXED value固定的
如果想要描述实体
<!ENTITY 实体名字 "实体的值">
<!ENTITY spring "this is spring">
<div>&spring;</div>
以下为实例
myxml.dtd
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT school (class*)>
<!ELEMENT class (teacher,student*)>
<!ELEMENT teacher (sex)>
<!ELEMENT student (sex)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST school
id CDATA #IMPLIED
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
>
school.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE school SYSTEM "myxml.dtd">
<school id="duyi" name="渡一教育" loc="哈尔滨">
<class id="one" name="Java1期" loc="上海">
<teacher id="t1" name="zzt" age="18">
<sex>男</sex>
</teacher>
<student id="s1" name="赵一" age="15">
<sex>女</sex>
</student>
<student id="s2" name="钱二" age="16">
<sex>女</sex>
</student>
<student id="s3" name="孙三" age="17">
<sex>男</sex>
</student>
<student id="s4" name="李四" age="18">
<sex>男</sex>
</student>
</class>
<class id="two" name="Java2期" loc="深圳">
<teacher id="t2" name="panda" age="58">
<sex>纯爷们儿</sex>
</teacher>
<student id="s5" name="周五" age="18">
<sex>男</sex>
</student>
<student id="s6" name="吴六" age="17">
<sex>男</sex>
</student>
<student id="s7" name="郑七" age="16">
<sex>女</sex>
</student>
<student id="s8" name="王ba" age="15">
<sex>女</sex>
</student>
</class>
</school>
DOM解析
package parsexml;
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 Dom {
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/testxml/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
package parsexml;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import java.io.File;
import java.util.List;
public class JDOM {
public static void main(String[] args){
try {
System.out.println("以JDOM形式进行解析 需要一个jdom.jar外部包");
//获取builder对象 自己创建
SAXBuilder builder = new SAXBuilder();
File file = new File("src/testxml/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
package parsexml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class DOM4J {
public static void main(String[] args){
try {
System.out.println("利用DOM4J形式解析 需要以来外部dom4j.jar");
//创建一个解析对象
SAXReader reader = new SAXReader();//理解为是之前的builder对象
//提供一个文件
File file = new File("src/testxml/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();
}
}
}