xml重点笔记(尚学堂 3h)

XML:可扩展标记语言

主要内容(了解即可)

1.XML介绍

2.DTD

3.XSD

4.DOM解析

6.SAX解析

学习目标

一. XML介绍

1.简介

XML(Extensible Markup Language) 可扩展标记语言,严格区分大小写

2.XML和HTML

XML是用来传输和存储数据的。

XML多用在框架的配置文件中

XML大多平台都支持,所以可以实现跨平台数据传输

HTML是用来显示数据的

3.XML的引入

XML的引入:

保存5个学生对象的信息(持久化保存)

A、保存数组/集合====>内存中当项目重启后我们保存到内存中数据就会丢失

B、使用IO流保存到文件中优点:实现数据的持久化保存缺点:保存数据比较麻烦,并且保存的对象值我们看不懂

C、使用XML进行数据的保存

1\]进行数据的存储(数据存储的功能就在这个阶段使用,以后不用xmL进行数据存储) \[2\]在我们后期学习(javaEE/框架)中充当配置文件 **D、数据库(最终数据存储位置)** #### 4.语法 \<元素名 属性名="属性值"\>文本内容\。 前后元素名相同,元素名自定义。 每个元素可以有0到多个属性,属性名自定义。 文本内容表示文字。 支持嵌套结构。 结束时元素名前有/。 #### 5.语法要求 **XML的语法和HTML语法是差不多的,但是比HTML要求更加严格。** 1.元素正确嵌套 2.XML文件的第一行必须是xml声明 3.只能有一个根节点 4.严格区分大小写 5.结束标签必须包含/ 6.属性值的设置必须被包围起来 **7.XML认为换行标记也属于文本节点** 8.\<!----\>注释。有的非官方资料认为这是注释节点。 ```xml-dtd 张三 12 88 李四 13 99 ``` #### 6.特殊符号 ##### 6.1 实体符号 | 字符实体 | 特殊字符 | 含义 | |--------|------|-----| | \&It | \< | 小于 | | \> | \> | 大于 | | \& | \& | 和号 | | \&apos | ' | 单引号 | | \" | " | 双引号 | ##### 6.2 转义标签 ```java ``` ### 二,小节实现案例-编写XML文件 #### 1.需求 项目根路径下创建product.xml并存储下面信息。 根节点叫做products,里面包含3个product元素。每个元素里面又包含下面的元素及文本内容 ![image-20240916103934692](https://img-blog.csdnimg.cn/img_convert/c342141b447ceb1c9cb97d1ed7ddb56b.png) #### 2.实现 ```xml P001 蜘蛛王皮鞋 268 黑色 42 500 ``` ### 三.DTD(约束) #### 1.简介 DTD(Document Type Definition) **文档类型定义**。 即约束XML文件中可以包含哪些元素、哪些属性、及元素个数和元素之间的关系和元素的顺序。 **在包含DTD的XML文件中,如果XML内容不满足DTD要求,会提示错误。** #### 2.分类 DTD的三种分类: 1.内部DTD 2.外部DTD 3.公共DTD ##### 2.1内部DTD **直接在XML中编写DTD内容。不推荐。** 1. \内容可以是其他标签,也可以是#PCDATA文本内容。 2. \定义属性 3. 内容控制可取值: 1. #REQUIRED必须有这个属性 2. #IMPLIED可以有也可以没有 ​ 3. #FIXED"内容"必须取固定值 4. (name,age,score)表示顺序必须是先name,后age,然后score 5. student+表示student至少出现一次。括号内容的元素名都可以跟下面符号 1.?表示子元素出现0次到1次(最多出现一次) 2.+表示子元素至少出现一次(至少出现一次) 3.\*表示子元素可以出现0到多次(任意) ```xml ]> 张三 18 ``` ##### 2.2外部DTD(项目配置文件来源于此!!!) 外部DTD是我们自己编写的DTD文件。通过引I入方式引I入DTD。 在外部创建一个xxx.dtd文件,文件内容和内部dtd\[\]中的内容相同。 ###### 1.新建dtd文件 ```xml ``` ###### 2.xml引入外部dtd文件 ```xml 张三 18 ``` ##### 2.3公共DTD **公共DTD是一些开源组织编写的DTD,并且已经发布到互联网中。** 公共DTD语法: \< !DOCTYPE 根元素 PUBLIC "DTD标识名" "公用DTD的URI"\> ```xml ``` #### 3, 总结 DTD是较简单的语法检查机制。整体语法较简单,功能较单一。 当需要对XML文件结构更新时,需要修改整个DTD文件,不够灵活。 ### 四, XSD #### 1.简介 XSD(XML Schema Definition)XML模式定义。 **属于DTD的升级版。完美的解决了DTD使用时不易扩展问题,并且提供了更强大功能。** #### 2.定义XSD 新建xxx.xsd。 所有需要的元素,属性都需要被定义。 ```xml ``` #### 3.引用xsd ```xml 11 false ``` ### 五.XML 解析 #### 1.简介 **在Java中提供了两种XML解析方式: DOM、SAX。** #### 2.DOM解析 ​ Document Object Model文档对象模型。把XML文件一次性加载到内存中,并转换为树状模型。然后一个节点一个节点的解析,**这种解析方式效率较高,但是比较消耗内存,适用于小型XML文档。** ![image-20240916140617102](https://img-blog.csdnimg.cn/img_convert/22d079e55c5d6fc0df526cdd0e511adf.png) #### 3.SAX(Spring) SAX(SimpleAPIforXML)解析:是基于事件的解析,它是为了解决DOM解析的资源耗费而出现的。SAX在解析一份XML文档时,会依次出发文档开始、元素开始、元素结束、文档结束等事件,应用程序通过监听解析过程中所触发的事件即可获取XML文档的内容。该方式不需要事先调入整个文档,**优势是占用资源少,内存消耗小,一般在解析数据量较大的文档是采用该方式。** ### 六.DOM解析 #### 1.简介 DOM解析所有API都是org.w3c包中。 使用DOM操作XML按照标准树状结构一层一层解析。 解析器是基于工厂设计模式的。当获取到文档对象后每个元素都是一个节点,然后操作节点对象。 在DOM解析时,每个换行符都是一个文本节点,所以一定要过滤掉换行。 ![image-20240916140952399](https://img-blog.csdnimg.cn/img_convert/7c794e0225fbd4f847a61b3eebda3790.png) #### 2.代码示例 以上面的students作为xml进行解析。 **已知XML文件就三层结构,所以直接使用循环进行解析。如果XML文档结构比较深,此处需要使用递归。** ```java public class TestDoM { public static void main(String[] args) throws Exception { parse(); } //使用DoM解析XML public static void parse() throws ParserConfigurationException, IoException, SAXException { //1.获取document构建 工厂对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //2.根据文档构建工厂获取文档构建对象 /* 将xm1变为document * 手动的创建document **/ DocumentBuilder db = dbf.newDocumentBuilder(); //3.使用文档构建对象,将xm1解析为document对象 Document document = db.parse(new File("stu.xm1")); //4.根据标签名获取跟标签 NodeList rootList = document.getElementsByTagName("students"); //5.xm1中仅会存在一个跟标签,获取这个根标签 Node root = rootList.item(0); System.out.print1n ("根节点名称: " + root.getNodeName(); //6.获取标签所有的直接子节点 NodeList chi1dNodes = root.getChi1dNodes(); for (int i = 0; i < childNodes.getLength(); i++){ //7.获取每一个子节点 /* * getNodeType(): 结点类型,常量 * 1: 标签结点 * 2: 属性结点 * 3: 文本结点 **/ Node item = childNodes.item(i); if (item.getNodeType() == Node.ELEMENT_NODE) { System.out.println("子节点名称: " + item.getNodeName()); //8.获取该结点的所有子节点 NodeList childNodes1 = item.getChildNodes();发送 for(int j = 0; j < childNodes1.getLength(); j++) { Node item1 = childNodes1.item(j); if (item1.getNodeType() == Node.ELEMENT_NODE) { System.out.println("子节点名称: " + item1.getNodeName() + ":" + item1.getTextContent())); } } } } } } ``` ### 七.使用DOM生成XML #### 1.简介 DOM生成XML时主要是创建节点。然后把节点添加到上层节点。 #### 2.代码示例 ```java public class TestDoM { public static void main(String[] args)throws Exception { transform(); } //先构建文档,再将文档变为xml public static void transform throws ParserConfigurationException, TransformerException, FileNotFoundException{ //1.获取文档构建器工厂对象 DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //2.构建器工厂对象 获取 构建器对象 DocumentBuilder db=dbf.newDocumentBuilder(); //3.创建文档对象 Document document=db.newDocument(); //4.创建teachers标签 Element teachers=document.createElement("teachers"); //5.创建teacher标签 Element teacher =document.createElement("teacher"); teacher.setAttribute("id","tea");//设置属性 //6.创建name标签 Element name =document.createElement("name"); name.setAttribute("class", "na"); // 设置属性 name.setTextContent("zs"); //7.创建age标签 Element age = document.createElement("age"); age.setTextContent("18"); //8.创建sex标签 Element sex = document.createElement("sex"); sex.setTextContent("男"); //9.设置标签之间的关系 //添加teacher的子标签* teacher.appendchild(name); teacher.appendchild(age); teacher.appendchild(sex); } } ``` ### 八.SAX解析 #### 1.简介 **SAX解析是基于事件模型完成的。所有的API都在org.Xml中。 SAX解析时也会识别换行为文本节点,这个坑一定躲避。** #### 2.代码示例 ```java public class TestSAX { public static void main(String[] args) throws Exception { parse(); } public static void parse() throws Exception { //1.SAX解析器工厂对象 SAXParserFactory spf = SAXParserFactory.newInstance(); //2.基于工厂对象获取解析器对象 SAXParser sp = spf.newSAxParser(); //3.使用解析器解析xml sp.parse(new File("java_day13/teacher.xm1"),new MyHandler()); } public class MyHandler extends DefaultHandler { String name = null; @override public void startDocument() throws SAXException { System.out.print1n("文档开始解析"); } @override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("开始解析,标签名: " + qName); name = qName; } @Override } } ``` ### 九, SAX生成 #### 1.简介 SAX生成XML和手写XML比较相似。 也是在调用5个操作方法。 #### 2.代码生成 ```java public class TestSAX { public static void main(String[] args) throws Exception { parse(); } public void transfom() throws TransformerConfigurationException, FileNotFoundException,SAxException { //1.创建转换器工厂 SAXTransformerFactory stff =(SAXTransformerFactory) SAXTransformerFactory.newInstance(); //2.根据工厂获取转换器 /* *传输 *创建xml **/ TransformerHandler th = stff.newTransformerHandler(); Transformer transformer = th.getTransformer(); transformer.setOutputProperty(OutputKeys.INDENT,"yes"); transformer.setOutputProperty(OutputKeys.ENcoDING,"utf-8"); transformer.setoutputProperty("{http://xml.apache.org/xslt}indent-amount","2"); th.setResult(new StreamResult(new FileoutputStream("stu.xml"))); th.startElement(null,null,"students",null); AttributesImpl attributes = new AttributesImpl(); attributes.addAttribute(null,null,"id",null,"aa"); th.startElement(null,null,"student",attributes); th.startElement(null, null, "name", null); char[] chars = "zs".tocharArray(); th.characters(chars,0,chars.length); th.endElement(null, null, "name"); th.startElement(null, null, ""age", null1); char[] chars1 = "19".toCharArray(); th.characters(chars1,0,chars1.1ength); th.endElement(null, null, "age"); th.startElement(null, null, "sex", null); char[] chars2 ="男".tocharArray(); th.characters(chars2,0,chars2.length); th.endelement(null, null,"sex"); th.endElement(null,null,"student"); th.endelement(null,null,"students"); th.endDocument(); } } ```

相关推荐
代码小将1 小时前
Leetcode209做题笔记
java·笔记·算法
专注_每天进步一点点1 小时前
idea 启动Springboot项目在编译阶段报错:java: OutOfMemoryError: insufficient memory
java·spring boot·intellij-idea
朗迹 - 张伟1 小时前
UE5 PCG学习笔记
笔记·学习·ue5
dhxhsgrx2 小时前
PYTHON训练营DAY25
java·开发语言·python
寻丶幽风3 小时前
论文阅读笔记——双流网络
论文阅读·笔记·深度学习·视频理解·双流网络
不知几秋3 小时前
数字取证-内存取证(volatility)
java·linux·前端
chxii6 小时前
5java集合框架
java·开发语言
yychen_java7 小时前
R-tree详解
java·算法·r-tree
JANYI20187 小时前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式
xrkhy7 小时前
反射, 注解, 动态代理
java