Web笔记----XML文件

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

 

上一篇:TypeScript--交叉类型


下一篇:JSP第六次