美文网首页
XML之DTD规则和DOM解析、JDOM、DOM4J

XML之DTD规则和DOM解析、JDOM、DOM4J

作者: _FireFly_ | 来源:发表于2019-10-04 20:17 被阅读0次

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

    相关文章

      网友评论

          本文标题:XML之DTD规则和DOM解析、JDOM、DOM4J

          本文链接:https://www.haomeiwen.com/subject/tbgyuctx.html