Web笔记----XML文件

本文介绍了XML的基本概念,包括它的作用和写法,并详细讲解了DTD(文档类型定义)在确保XML文档结构正确性方面的重要性。接着,展示了如何创建DTD规则文件以及XML文件,遵循这些规则。还探讨了XML解析的两种主要方法——DOM和SAX解析,对比了它们的优缺点。最后,提到了基于DOM优化的JDOM和DOM4J解析库,并提供了相关示例代码。
摘要由CSDN通过智能技术生成

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

JDOM解析

基于DOM解析优化后的一种解析方式

需导入第三方 .jar 包使用

package testDtd;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import java.io.File;
import java.util.List;

public class TestJDOM {
    public static void main(String[] args){
        try {
            System.out.println("以JDOM形式进行解析 需要一个jdom.jar外部包");
            //获取builder对象   自己创建
            SAXBuilder builder = new SAXBuilder();
            File file = new File("src/testDtd/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解析

基于JDOM解析优化后的一种更新

需导入第三方 .jar 包使用

package testDtd;


import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

public class TestDOM4J {
    public static void main(String[] args) {
        try {
            System.out.println("利用DOM4J形式解析 需要以来外部dom4j.jar");
            //创建一个解析对象
            SAXReader reader = new SAXReader();//理解为是之前的builder对象
            //提供一个文件
            File file = new File("src/testDtd/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();
        }
    }
}

.jar下载地址:https://download.csdn.net/download/qq_41983207/16680381

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值