Java学习路线-45:XML快速入门(1)- XML、DTD、JAXP、Schema

简介: Java学习路线-45:XML快速入门(1)- XML、DTD、JAXP、Schema

第1 章 : XML入门

课时1 XML简介

eXtensible Markup Language

主要使用1.0版本

语言

中文名称

用途

html

标记型语言

显示数据

xml

可扩展标记型语言

存储数据

课时2 XML的应用

1、传输数据

2、表示有关系的数据

3、配置文件

课时3 XML的文档声明

1)xml的文档声明

(2)定义元素(标签)

(3)注释

(4)特殊字符

(5)CDATA区

(6)PI指令

文件*.xml

1、xml的文档声明

必须写在第一行第一列

<?xml version="1.0" encoding="gbk" ?>

属性:

version 版本 1.0

encoding 编码 gbk/utf-8

standalone 依赖其他文件 yes/no

课时4 XML中文乱码问题解决

<?xml version="1.0" encoding="gbk" ?>
<person>
    <name>张三</name>
    <age>23</age>
</person>  

课时5 XML元素的定义

1、只能有一个根标签

2、合理嵌套

3、空格和换行都会当做原始内容解析

4、有开始必须有结束

<person></person>

5、标签没有内容,可以在标签内结束

<person />

标签命名规则

(1)区分大小写

(2)不能以数字下划线开头

(3)不能以xml、XML、Xml等开头

(4)不能包含空格和冒号

(5)标签可以是中文


课时6 XML属性的定义

html和xml都是标记型文档,可以有属性

<person id="001"></person>

属性要求

(1)一个标签可以有多个属性

(2)属性名称不能相同

(3)属性名称与属性值之间使用等号(=)

(4)属性值使用引号(单引号或双引号)包起来

(5)属性名命名贵方和元素的命名规范一致

课时7 XML注释

<!--  这里是注释 -->

注释不能嵌套

注释不能放到第一行

课时8 XML特殊字符

>&gt;

<&lt;

课时9 XML的CDATA区

可以解决多个字符都需要转义的操作

特殊字符会当做文本内容

<![CDATA[ 内容 ]]>

课时10 XML的PI指令

Processing Instruction

可以在xml中设置样式

只能对英文标签起作用

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/css" href="./demo.css" ?>
<person>
    <name>张三</name>
    <age>23</age>
</person>  

demo.css

name{
    color: green;
}

课时11 XML约束简介

1、xml语法总结

(1)所有xml元素都必须有关闭标签

(2)xml标签对大小写敏感

(3)xml必须正确嵌套

(4)xml必须有且只有一个根元素

(5)xml属性值需要加引号

(6)特殊字符必须转义

(7)原样输出文本使用<![CDATA[]]>

(8)xml中的空格、回车换行在解析时会被保留

2、xml的约束

(1)dtd约束

(2)scheme约束

第2 章 : DTD(文档类型定义)

课时12 DTD快速入门

文件*.dtd,使用idea打开会提示

文档类型定义(DTD,Document Type Definition)

1、复杂元素:有子元素的元素

<!ELEMENT 元素名称 (子元素)>
eg:
<!ELEMENT person (name,age)>

2、简单元素

<!ELEMENT 元素名称 (#PCDATA)>
eg:
<!ELEMENT age (#PCDATA)>

3、引入dtd文件

<!DOCTYPE person SYSTEM "demo.dtd">
• 1

示例

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE person SYSTEM "demo.dtd">
<person>
    <name>张三</name>
    <age>23</age>
</person>

demo.dtd

<!ELEMENT person (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

课时13 DTD的三种引入方式

1、引入外部

<!DOCTYPE 根元素名称 SYSTEM "dtd路径">

2、引入内部

<!DOCTYPE 根元素名称 [
        <!ELEMENT person (name, age)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
]>

3、使用网络

<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD路径URL">

课时14 使用DTD定义元素

语法

<!ELEMENT 元素名 约束>

1、简单元素:没有子元素的元素

<!ELEMENT 元素名 (#PCDATA)>

(#PCDATA) 字符串(需要加括号)

EMPTY 元素为空

ANY 任意

2、复杂元素

<!ELEMENT 元素名 (子元素)>

(1)子元素出现次数

+ 一次或多次

? 零次或一次

* 零次或多次

(2)子元素分隔符

逗号隔开:表示出现顺序

竖线隔开:表示任意一个

eg:

<!ELEMENT person (name+, age?, sex, school*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex EMPTY>
<!ELEMENT school ANY>

课时15 使用DTD定义属性

语法

<! ATTLIST 元素名称
    属性名称 属性类型 属性的约束
>

1、属性类型

(1)CDATA 字符串

(2)(a|b|c) 枚举

(3)ID 值只能以字母或下划线开头

2、属性的约束

(1)#REQUIRED 属性必须存在

(2)#IMPLIED 属性可有可无

(3)#FIXED 属性必须是固定值

(4)默认值 不写属性做为默认值

eg:

<!ATTLIST 页面作者
    姓名 CDATA #REQUIRED
    年龄 CDATA #IMPLIED
    职位 CDATA #FIXED 作者
    爱好 CDATA 写作
>

课时16 定义实体

语法

定义
<!ENTITY 实体名称 "实体值">
使用
&实体名称

实体需要定义在内部dtd

课时17 W3C的案例

https://www.w3school.com.cn/dtd/dtd_examples.asp

第3 章: XML解析之JAXP

课时18 XML解析简介

1、dom方式解析xml过程:

根据xml的层级结构,在内存中分配一个树形结构

把xml中每部分都封装成对象

(1)优点:方便实现增、删、改操作

(2)缺点:如果文件过大,造成内存溢出

2、sax方式解析xml过程:

采用事件驱动,边读边解析,从上到下,一行一行的解析,

解析到一个对象,把对象名称返回

(1)优点:不会造成内存溢出,实现查询

(2)缺点:不能实现增、删、改操作

课时19 JAXP API的查看

dom和sax解析器:

(1)sun公司 jaxp

(2)dom4j组织 dom4j(实际开发)

(3)jdom组织 jdom

1、jaxp

jaxp是javese一部分

javax.xml.parses

interface Node{
    // 添加节点
    public Node appendChild(Node newChild);
    // 移除节点
    public Node removeChild(Node oldChild);
    // 获取父节点
    public Node getParentNode();
    // 返回文本内容
    public String getTextContent()
}
interface NodeList{
    // 通过下标获取具体值
    public Node item(int index);
    // 得到集合长度
    public int getLength();
}
interface Document extends Node{
    // 获取标签
    public NodeList getElementsByTagName(String tagname);
    // 创建标签
    public Element createElement(String tagName);
    // 创建文本
    public Text createTextNode(String data);
}
abstract DocumentBuilder{
    public Document parse(File f)
}
abstract DocumentBuilderFactory{
    public static DocumentBuilderFactory newInstance()
    public abstract DocumentBuilder newDocumentBuilder()
}
abstract class SAXParser{}
abstract class SAXParserFactory{}

课时20-21 使用JAXP查询节点

示例:查询xml中所有name值

demo.xml

<?xml version="1.0" encoding="utf-8" ?>
<list>
    <person>
        <name>张三</name>
        <age>23</age>
    </person>
    <person>
        <name>李四</name>
        <age>24</age>
    </person>
</list>
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class Demo {
    /**
     * 1、创建解析器工厂
     * 2、根据解析器工厂创建解析器
     * 3、解析xml返回document
     *
     */
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("demo.xml");
        NodeList list = document.getElementsByTagName("name");
        for (int i = 0; i < list.getLength(); i++) {
            Node node = list.item(i);
            String name = node.getTextContent();
            System.out.println(name);
            // 张三 李四
        }
    }
}

课时22 使用JAXP添加节点

在person节点下添加sex子节点

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class Demo {
    public static void main(String[] args) throws Exception {
        // 创建解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 根据解析器工厂创建解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析xml返回document
        Document document = builder.parse("demo.xml");
        NodeList list = document.getElementsByTagName("person");
        // 获取第一个元素
        Node node = list.item(0);
        // 创建一个元素
        Element element = document.createElement("sex");
        Text text = document.createTextNode("女");
        // 添加创建的元素到节点
        element.appendChild(text);
        node.appendChild(element);
        // 回写到硬盘
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult("demo.xml"));
    }
}

课时23-24 使用JAXP修改、删除节点

xml读取和保存的工具类

package util;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.IOException;
public class DocumentUtil {
    public static Document loadXml(String filename) throws ParserConfigurationException, IOException, SAXException {
        // 创建解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 根据解析器工厂创建解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析xml返回document
        return builder.parse(filename);
    }
    public static void dumpXml(String filename, Document document) throws TransformerException {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult(filename));
    }
}
import org.w3c.dom.*;
import util.DocumentUtil;
public class Demo {
    public static void main(String[] args) throws Exception {
        String filename = "demo.xml";
        // 读取
        Document document = DocumentUtil.loadXml(filename);
        // 查询节点
        NodeList list = document.getElementsByTagName("name");
        Node node = list.item(0);
        // 设置节点内容
        node.setTextContent("大壮");
        // 删除节点
        Node parentNode = node.getParentNode();
        parentNode.removeChild(node);
        // 回写到硬盘
        DocumentUtil.dumpXml(filename, document);
    }
}

课时25 使用JAXP遍历节点

使用递归遍历

import org.w3c.dom.*;
import util.DocumentUtil;
public class Demo {
    public static void listElement(Node node) {
        // 如果节点类型元素节点则打印
        if(node.getNodeType() == node.ELEMENT_NODE){
            System.out.println(node.getNodeName());
        }
        NodeList list = node.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            listElement(list.item(i));
        }
    }
    public static void main(String[] args) throws Exception {
        String filename = "demo.xml";
        // 读取
        Document document = DocumentUtil.loadXml(filename);
        listElement(document);
    }
}

第4 章 : Schema:基于XML的DTD替代者

课时26 Schema的介绍

dtd语法

<!ELEMENT 元素名称 约束>


scheme符合xml语法

一个xml可以有多个scheme,使用名称空间区分

dtd有PCDAT类型scheme支持更多数据类型

scheme语法更加复杂

Schema 教程

https://www.w3school.com.cn/schema/index.asp

课时27 Schema的开发过程

文件*.xsd

1、属性

<!-- 表示约束文件 -->
xmlns="http://www.w3.org/2001/XMLSchema"
<!-- 约束文件命名空间 url地址保证不会重复 -->
targetNamespace="http://www.w3school.com.cn"
<!-- 质量良好 -->
elementFormDefault="qualified"

2、复杂元素

<complexType>
    <sequence>
        <element name="name" type="string"></element>
        <element name="age" type="int"></element>
    </sequence>
</complexType>

3、引入约束文档

表示被约束文档,别名xsi
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
路径地址
xsi:schemaLocation="http://www.w3school.com.cn demo.xsd">

完整示例

demo.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.w3school.com.cn"
        elementFormDefault="qualified">
    <element name="person">
        <complexType>
            <sequence>
                <element name="name" type="string"></element>
                <element name="age" type="int"></element>
            </sequence>
        </complexType>
    </element>
</schema>

引入xsd文件

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.w3school.com.cn"
      xsi:schemaLocation="http://www.w3school.com.cn demo.xsd">
        <name>张三</name>
        <age>23</age>
</person>

课时28 Schema约束API查看

sequence 表示元素出现顺序

all 只能出现一次

choice 出现任意一个

maxOccurs=“unbounded” 出现次数没有限制

any 任意元素

复杂元素中定义属性

<attribute name="age" type="int" use="required"></attribute>

引入多个schema,可以给每个schema取别名

课时29 sax解析的过程

dom 内存虚拟树形结构

sax 事件驱动,边读边解析

package org.xml.sax;
public class HandlerBase{
    public void startElement (String name, AttributeList attributes);
    public void characters (char ch[], int start, int length);
    public void endElement (String name);
}
package org.xml.sax.helpers;
public class DefaultHandler{
    public void startElement (String uri, String localName,
                              String qName, Attributes attributes)    
    public void endElement (String uri, String localName, String qName)
    public void characters (char ch[], int start, int length)
}

课时30 使用Schema的sax方式操作xml

demo.xml

<?xml version="1.0" encoding="UTF-8"?>
<person> 
    <name>张三</name>  
    <age>23</age> 
</person>

使用jaxp的sax解析只能进行查询操作

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class Demo {
    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        // 传入事件处理类
        parser.parse("demo.xml", new MyDefaultHandler());
    }
}
/**
 * 自定义事件处理
 */
class MyDefaultHandler extends DefaultHandler {
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) {
        System.out.println(qName);
    }
    @Override
    public void endElement(String uri, String localName, String qName) {
        System.out.println(qName);
    }
    @Override
    public void characters(char[] ch, int start, int length) {
        System.out.println(new String(ch, start, length));
    }
}
相关文章
|
11月前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
XML JavaScript Java
【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!
【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。
649 1
|
11月前
|
Java
Java快速入门之判断与循环
本文介绍了编程中的流程控制语句,主要包括顺序结构、判断结构(if语句和switch语句)以及循环结构(for、while和do...while)。通过这些语句可以精确控制程序的执行流程。if语句有三种格式,分别用于简单条件判断、二选一判断和多条件判断。switch语句适用于有限个离散值的选择判断,而循环结构则用于重复执行某段代码,其中for循环适合已知次数的情况,while循环适合未知次数但有明确结束条件的情况,do...while则是先执行后判断。文中还提供了多个示例和练习,帮助读者理解并掌握这些重要的编程概念。
|
11月前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
361 4
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
164 3
|
C# 前端开发 UED
WPF数据验证实战:内置控件与自定义规则,带你玩转前端数据验证,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据验证是确保输入正确性的关键环节。前端验证能及时发现错误,提升用户体验和程序可靠性。本文对比了几种常用的WPF数据验证方法,并通过示例展示了如何使用内置验证控件(如`TextBox`)及自定义验证规则实现有效验证。内置控件结合`Validation`类可快速实现简单验证;自定义规则则提供了更灵活的复杂逻辑支持。希望本文能帮助开发者更好地进行WPF数据验证。
497 0
|
7月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
215 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
287 1
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)