《XML入门(阿里云大学)》笔记
作者:互联网
课程链接:https://edu.aliyun.com/course/1708
————————————————————————————————————
第1章:XML入门
课时1:XML简介
- XML主要功能:为了存储数据。
- XML的版本:
- 1.0(使用)
- 1.1(不使用,不能向下兼容)
课时2:XML的应用
- XML的应用:
- 不同系统之间数据传输
- 用来表示生活中有关系的数据
- 用在文件中进行信息的配置
课时3:XML的文档声明
课时4:XML中文乱码问题解决
- 解决中文乱码:保证文档声明中的encoding和文件保存的编码一致。
课时5:XML元素的定义
课时6:XML属性的定义
课时7:XML注释
课时8:XML特殊字符
课时9:XML的CDATA区
- CDATA区作用:解决多个字符都需要转义的操作,把这些内容放到CDATA区里,就不需要转义了。
课时10:XML的PI指令
- PI指令(处理指令)
▲ PI指令也仍然是不能放在第一行的,第一行一定得是文档声明。
课时11:XML语法规则总结
课时12:XML约束简介
第2章:DTD(文档类型定义)
课时12:DTD快速入门
-
DTD文件:
-
xml中有几个元素,dtd文件中就写几个<!ELEMENT>
-
元素:
-
简单元素:没有子元素的元素
<!ELEMENT 元素名称 (#PCDATA)>
-
复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
-
-
在xml文件中引入dtd文件:
<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
-
-
如果用浏览器打开xml文件,浏览器只校验xml的语法,不校验约束。所以如果需要校验xml的约束,需要使用工具,如myeclipse、idea。
-
示例:
-
编写person.dtd文件:
<!ELEMENT person (name, age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)>
-
编写person.xml文件:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE person SYSTEM "person.dtd"> <person> <name>皮卡丘</name> <age>10</age> </person>
此时如果在xml文件,给person标签新加子标签的话,在idea中会产生以下效果(鼠标放在新标签上):
-
课时13:DTD的引入方式
-
DTD的引入方式:
- 使用外部DTD(本系统的)
- 使用内部DTD
- 使用公共DTD(网络上的)
-
使用内部DTD:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE person [ <!ELEMENT person (name, age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]> <person> <name>皮卡丘</name> <age>10</age> </person>
-
使用公共DTD(如struts2配置文件):
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
课时14:使用DTD定义元素
-
简单元素:
<!ELEMENT 元素名称 约束类型>
-
约束类型:
- (#PCDATA):约束为字符串类型
- EMPTY:约束为空(没有内容)
- ANY:可为空,可不为空
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE person [ <!ELEMENT person (name, age, sex, title)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex EMPTY> <!ELEMENT title ANY> ]> <person> <name>皮卡丘</name> <age>10</age> <sex></sex> <!--<title></title>--> <title>007</title> </person>
-
-
复杂元素:
<!ELEMENT 元素名称 (子元素)>
-
子元素出现的次数(下述符号表示与正则一致):
- ”+“(加号):表示至少出现1次
- ”?“(英文问号):表示出现0或1次
- ”*“(星号):表示可出现任意次
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE person [ <!ELEMENT person (name+, age?, sex*, title)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex EMPTY> <!ELEMENT title ANY> ]> <person> <name>皮卡丘1</name> <name>皮卡丘2</name> <!--<age>10</age>--> <sex></sex> <!--<title></title>--> <title>007</title> </person>
-
子元素的分隔符:
- ”,“(英文逗号):标签中的子元素需要按约束的顺序出现
- ”|“(竖杠):标签中的子元素只能出现约束中的任意一个
-
课时15:使用DTD定义属性
-
属性类型:
- CDATA:约束为字符串类型
- 枚举:使用括号包起来,枚举值使用竖杠分隔,约束为只能等于枚举值中的任意一个
- ID:表示属性的取值不可重复,并且只能由字母、下划线开始,也不能出现空白字符
-
属性约束:
- #REQUIRED:表示该属性必须出现
- #IMPLIED:表示该属性可有可无
- #FIXED:表示该属性的取值为一个固定值:#FIXED “固定值”
- 默认值:表示未定义该属性时,则直接使用默认值
-
示例:
-
官方示例:
<!ATTLIST 页面作者 姓名 CDATA #IMPLIED 年龄 CDATA #IMPLIED 联系信息 CDATA #REQUIRED 网站职务 CDATA #FIXED "页面作者" 个人爱好 CDATA "上网" >
- 姓名、年龄:可有可无
- 联系信息:必须有
- 网站职务:固定为”页面作者“
- 个人爱好:默认为”上网
-
个人示例:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE person [ <!ELEMENT person (name+, age?, sex, heart)> <!ELEMENT name (#PCDATA)> <!--name的属性id: 值:不可重复,并且要以字母/下划线开头 属性:可以设置,也可以不设置--> <!ATTLIST name id ID #IMPLIED > <!--age的属性value: 值:默认为10--> <!ELEMENT age (#PCDATA)> <!ATTLIST age value CDATA "10" > <!--sex的属性value: 值:只能为“女”或“男” 属性:必须设置--> <!ELEMENT sex (#PCDATA)> <!ATTLIST sex value (女|男) #REQUIRED > <!--heart的属性count: 值:只能为1--> <!ELEMENT heart EMPTY> <!ATTLIST heart count CDATA #FIXED "1" > ]> <person> <name id="i1">皮卡丘1</name> <name>皮卡丘2</name> <age>10</age> <sex value="男"></sex> <heart count="1"></heart> </person>
-
课时16:定义实体
-
使用:
-
在DTD中定义(最好写在内部DTD里,因为某些浏览器可能获取不到外部DTD里的实体内容):
<!ENTITY 实体名称 "实体内容">
-
在XML中引用:
&实体名称;
-
-
示例:
-
定义:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE person [ <!ELEMENT person (name, age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ENTITY who "皮卡丘"> ]> <person> <name>&who;</name> <age>10</age> </person>
-
显示:
<person> <name>皮卡丘</name> <age>10</age> </person>
-
课时17:W3C的案例
案例网址:https://www.w3cschool.cn/dtd/dtd-examples.html
-
案例tvschedule.dtd代码:
<!DOCTYPE TVSCHEDULE [ <!ELEMENT TVSCHEDULE (CHANNEL+)> <!ELEMENT CHANNEL (BANNER,DAY+)> <!ELEMENT BANNER (#PCDATA)> <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)> <!ELEMENT HOLIDAY (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)> <!ELEMENT TIME (#PCDATA)> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED> <!ATTLIST CHANNEL CHAN CDATA #REQUIRED> <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED> <!ATTLIST TITLE RATING CDATA #IMPLIED> <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED> ]>
-
编写tvschedule.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE TVSCHEDULE SYSTEM "tvchedule.dtd"> <TVSCHEDULE NAME="CCTV"> <CHANNEL CHAN="10"> <BANNER>CCTV10科教频道</BANNER> <DAY> <DATE>2021-03-01</DATE> <HOLIDAY></HOLIDAY> </DAY> <DAY> <DATE>2021-03-02</DATE> <PROGRAMSLOT> <TIME>19:00</TIME> <TITLE>新闻联播</TITLE> </PROGRAMSLOT> </DAY> </CHANNEL> </TVSCHEDULE>
第3章:XML解析之JAXP(SUN公司官方提供的API)
课时18:XML解析简介
- XML解析方式:
- dom方式解析:
- 根据xml的层级结构在内存中分配一个树形结构,把xml的标签、属性和文本都封装成对象。
- 缺点:如果文件过大,会造成内存溢出。
- 优点:很方便地实现增删改操作。
- sax方式解析:
- 根据事件驱动,边读边解析
- 从上到下,一行一行地解析,解析到某一个对象,则返回对象名称
- 缺点:不能实现增删改操作。
- 优点:如果文件过大,也不会造成内存溢出;并且可以方便地实现查询操作。
- 根据事件驱动,边读边解析
- dom方式解析:
课时19:JAXP API的查看
-
想要解析xml,首先需要解析器。
-
不同公司和组织通过API来提供了针对dom和sax方式的解析器:
- SUN公司:jaxp
- dom4j组织:dom4j(实际开发中使用最多)
- jdom组织:jdom
-
jaxp解析器在jdk的javax.xml.parsers包(jdk9:java.xml模块中)里:
- dom类:
- DocumentBuilder:解析器类
- 抽象类,实例化方法:DocumentBuilderFactory.newDocumentBuilder()
- 方法:
- public Document parse(String uri) throws SAXException, IOException
- Document:
- 是org.w3c.dom.Node接口的子接口
- 方法:
- 获取标签:
- Element getElementById(String elementId)
- NodeList getElementsByTagName(String tagname)
- 获取标签:
- Document:
- public Document parse(String uri) throws SAXException, IOException
- DocumentBuilder:解析器类
- dom类:
标签:XML,xml,入门,元素,笔记,DTD,课时,皮卡丘 来源: https://blog.csdn.net/weixin_43494837/article/details/114925782