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;  
                &gt;大于   &lt;小于   &amp;与符号   &quot;双引号   &apos;单引号
            正常情况下 描述标签内部的子标签时候  默认认为是一个
            还需要在子标签基础上增加一个  对于个数的说明
            *符号    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();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读