xml学习笔记
一.基本概念的理解(来源于菜鸟教程)
1.xml类型的文件是什么?
xml是一种可扩展标记语言(EXtensible Markup Language)。实际上,xml中完全没有预定义过的标签,一切标签都需要我们自己定义。但是 XML 中所有标签都没有任何其他意义,只有人为加上去的语义,XML 只是被设计用来结构化、存储以及传输数据的。
2.xml和html有什么共同点和区别吗?
【区别】:HTML 被设计用来显示数据,html所有标签都是预定义过的。而其焦点是标签内的数据内容。
XML 被设计用来传输和存储数据,xml没有预定义的标签,所有标签都需要我们自己定义。其焦点是各个标签中数据之间的层次结构。
【共同点】:1.同HTML一样,xml也可以被css初始化 2.
二.xm语法规则
1.xml声明
1.声明文件的可选部分,如果存在需要一定要放在文档的第一行
2.若xml文件中存在着中文注释,可utf-8改成UTF8
<?xml version="1.0" encoding="utf-8"?>
2.xml文件只存在双标签,不存在单标签。
3.xml文件对大小写敏感,
4.xml文件属性值必须加引号,如下所示
<mapper namespace="com.junjun.dao.UserMapper"></mapper>
5.在 XML 中,有 5 个字符有特定含义,需要我们使用实体引用

三.xml的属性和元素
如下图所示,namespace就是属性,select是元素。属性与元素之间没有明显的界限,但是属性明显有着几个很大的缺陷:1.属性不能在其内部添加元素(不能拓展)2.属性不能被包含进树结构。因此,建议元数据(有关数据的数据)存储为属性,而数据本身存储为元素。
<mapper namespace="com.junjun.dao.UserMapper">
<select id="getUserList" resultType="com.junjun.pojo.User">
select
id as userid,name as username,pwd as userpwd
from user;
</select>
<select id="selectOne" parameterType="java.lang.String" resultType="map">
select id as id,name as xingming,pwd as mima from user where name = #{xingming};
</select>
<select id="selectAll" resultType="com.junjun.pojo.User">
select
id as userid,name as username,pwd as userpwd
from user where name like #{username};
</select>
<!-- insert中map中没有的会补上默认值0,null,false-->
<insert id="insert" parameterType="map">
insert into user(id,name,pwd) value(#{id},#{xingming},#{mima});
</insert>
<delete id="delete" parameterType="java.lang.String">
delete from user where name=#{username};
</delete>
<!-- 常见错误:1.There is no getter for property named 'id' in 'class com.junjun.pojo.User':传入对象中不存在属性"id"-->
<update id="update" parameterType="com.junjun.pojo.User">
update user
set name=#{xingming},pwd=#{mima}
where
id=#{id};
</update>
</mapper>
四.DTD
在我们学SSM框架的过程中,我们会遇到很多xml文件(下面这个是Mybatis的核心xml)
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
其中,http://mybatis.org/dtd/mybatis-3-config.dtd文档内容如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
<!--configuration元素由11个元素组成。-->
<!ELEMENT databaseIdProvider (property*)>
<!ATTLIST databaseIdProvider
type CDATA #REQUIRED
>
<!ELEMENT properties (property*)>
<!ATTLIST properties
resource CDATA #IMPLIED
url CDATA #IMPLIED
>
<!ELEMENT property EMPTY>
<!ATTLIST property
name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ELEMENT settings (setting+)>
<!ELEMENT setting EMPTY>
<!ATTLIST setting
name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ELEMENT typeAliases (typeAlias*,package*)>
<!ELEMENT typeAlias EMPTY>
<!ATTLIST typeAlias
type CDATA #REQUIRED
alias CDATA #IMPLIED
>
<!ELEMENT typeHandlers (typeHandler*,package*)>
<!ELEMENT typeHandler EMPTY>
<!ATTLIST typeHandler
javaType CDATA #IMPLIED
jdbcType CDATA #IMPLIED
handler CDATA #REQUIRED
>
<!ELEMENT objectFactory (property*)>
<!ATTLIST objectFactory
type CDATA #REQUIRED
>
<!ELEMENT objectWrapperFactory EMPTY>
<!ATTLIST objectWrapperFactory
type CDATA #REQUIRED
>
<!ELEMENT reflectorFactory EMPTY>
<!ATTLIST reflectorFactory
type CDATA #REQUIRED
>
<!ELEMENT plugins (plugin+)>
<!ELEMENT plugin (property*)>
<!ATTLIST plugin
interceptor CDATA #REQUIRED
>
<!ELEMENT environments (environment+)>
<!ATTLIST environments
default CDATA #REQUIRED
>
<!ELEMENT environment (transactionManager,dataSource)>
<!ATTLIST environment
id CDATA #REQUIRED
>
<!ELEMENT transactionManager (property*)>
<!ATTLIST transactionManager
type CDATA #REQUIRED
>
<!ELEMENT dataSource (property*)>
<!ATTLIST dataSource
type CDATA #REQUIRED
>
<!ELEMENT mappers (mapper*,package*)>
<!ELEMENT mapper EMPTY>
<!ATTLIST mapper
resource CDATA #IMPLIED
url CDATA #IMPLIED
class CDATA #IMPLIED
>
<!ELEMENT package EMPTY>
<!ATTLIST package
name CDATA #REQUIRED
>
1.DTD是什么
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。简单来说,DTD就是一个用来规范引用了该DTD的XML文档中(元素)标签使用方式的一个文档。例如,XML中任何标签都是自定义的,我们可以在<>中写任何内容生成任何标签;但是在使用DTD之后,我们只能按照DTD的规定使用DTD中规定的标签了。
2.DOCTYPE标签
DOCTYPE标签是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档。
3.XML中DTD的两种引用方法
XML文档可以在内部声明DTD,也可以冲外部引用一个DTD。
1.在xml文档内部引用DTD(案例来自菜鸟教程)
<?xml version="1.0"?>
<!DOCTYPE note [ <!--1.本文档是note类型的文档 -->
<!ELEMENT note (to,from,heading,body)> <!--2.note类型由于to,from,heading,body四种元素 -->
<!ELEMENT to (#PCDATA)> <!--3.to元素是PCDATA类型 -->
<!ELEMENT from (#PCDATA)> <!--4.form元素是PCDATA类型 -->
<!ELEMENT heading (#PCDATA)> <!--3.heading元素是PCDATA类型 -->
<!ELEMENT body (#PCDATA)> <!--3.body元素是PCDATA类型 -->
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
2.XML文档通过外部引用DTD
DOCTYPE语法规格如下:root-element是本文档的类型,filename是引用文档的名称。
【语法规范】: <!DOCTYPE root-element SYSTEM “filename”>
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd"><!--1.本文档是note类型的文档2.外部引用note.dtd中的内容-->
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
——在note.dtd文档中
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
4.DTD对xml中元素规范说明
本元素为空元素(没有任何子元素,是叶子节点):<!ELEMENT node EMPTY>
本元素只有 PCDATA 的子元素:<!ELEMENT from (#PCDATA)>
本元素:可携带任何内容:<!ELEMENT element-name ANY>
声明该元素由多个子元素组成,且子元素要按指定的顺序出现:<!ELEMENT note (to,from,heading,body)>
声明子元素一定会出现且只能出现一次的元素:<!ELEMENT note (message)>
声明子元素一定会出现且可出现多次的元素:<!ELEMENT note (message+)>
声明子元素可出现0次或一次的元素:<!ELEMENT note (message?)>
声明子元素可出现任意次数的元素:<!ELEMENT note (message*)>
声明子元素中只能二选一用|:<!ELEMENT note (to,from,header,(message|body))>
5.DTD对xml的属性的规范方式
【语法】<!ATTLIST element-name attribute-name attribute-type attribute-value>
【例如】:<!ATTLIST payment type CDATA "check">
其中attribute-type可有以下类型:
PCDATA:会被解析的字符类型(如不能出现<,>,&,’,"这五个字符)
CDATA:不会被解析的字符类型(可以出现以上五个字符)
ID:每一个ID的值必须唯一
IDREF:值为另外一个元素的ID
IDREFS:值为IDREF的一个列表
NMTOKEN:值为合法的 XML 名称(符合XML命名格式)
NMTOKENS:值为合法的 XML 名称的一个列表
ENTITY:值是一个实体
ENTITIES:值是一个ENTITIE的一个列表
NOTATION:此值是符号的名称
xml:值是一个预定义的 XML 值
其中attribute-value可有下列值:
#REQUIRED:必需的
#IMPLIED:不必需的
#FIXED value:属性值固定唯一,例如:<!ATTLIST sender company CDATA #FIXED "Microsoft">
6.DTD对xml的实体的规范方式
<!ENTITY entity-name "entity-value">7.学了DTD之后,我们就能把http://mybatis.org/dtd/mybatis-3-config.dtd文档看懂了。(看注释)
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
<!--configuration元素由以上11个元素组成,且所有元素都只能出现。-->
<!ELEMENT databaseIdProvider (property*)><!--databaseIdProvider-->
<!ATTLIST databaseIdProvider
type CDATA #REQUIRED
>
<!--1.properties由property标签组成,且可以出现任意次数
2.properties有resources和url这两个属性,属性都是不被解析的字符串类型,这两个属性不一定要使用(不使用会默认为null)
-->
<!ELEMENT properties (property*)>
<!ATTLIST properties
resource CDATA #IMPLIED
url CDATA #IMPLIED
>
<!--1.property元素没有子元素(是叶子节点),
2.property有两个必须要填写的不被解析的字符串类型
-->
<!ELEMENT property EMPTY>
<!ATTLIST property
name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!--setting标签由多个setting组成-->
<!ELEMENT settings (setting+)>
<!ELEMENT setting EMPTY>
<!ATTLIST setting
name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!--typeAliases元素由任意多个typeAlias和package元素组成-->
<!ELEMENT typeAliases (typeAlias*,package*)>
<!ELEMENT typeAlias EMPTY>
<!ATTLIST typeAlias
type CDATA #REQUIRED
alias CDATA #IMPLIED
>
<!ELEMENT typeHandlers (typeHandler*,package*)>
<!ELEMENT typeHandler EMPTY>
<!ATTLIST typeHandler
javaType CDATA #IMPLIED
jdbcType CDATA #IMPLIED
handler CDATA #REQUIRED
>
<!ELEMENT objectFactory (property*)>
<!ATTLIST objectFactory
type CDATA #REQUIRED
>
<!ELEMENT objectWrapperFactory EMPTY>
<!ATTLIST objectWrapperFactory
type CDATA #REQUIRED
>
<!ELEMENT reflectorFactory EMPTY>
<!ATTLIST reflectorFactory
type CDATA #REQUIRED
>
<!ELEMENT plugins (plugin+)>
<!ELEMENT plugin (property*)>
<!ATTLIST plugin
interceptor CDATA #REQUIRED
>
<!ELEMENT environments (environment+)>
<!ATTLIST environments
default CDATA #REQUIRED
>
<!ELEMENT environment (transactionManager,dataSource)>
<!ATTLIST environment
id CDATA #REQUIRED
>
<!ELEMENT transactionManager (property*)>
<!ATTLIST transactionManager
type CDATA #REQUIRED
>
<!ELEMENT dataSource (property*)>
<!ATTLIST dataSource
type CDATA #REQUIRED
>
<!ELEMENT mappers (mapper*,package*)>
<!ELEMENT mapper EMPTY>
<!ATTLIST mapper
resource CDATA #IMPLIED
url CDATA #IMPLIED
class CDATA #IMPLIED
>
<!ELEMENT package EMPTY>
<!ATTLIST package
name CDATA #REQUIRED
>
五.XML文件的读取方式
以上我们讲了这么久的xml是什么,有什么用,(dtd)怎么规范,那xml到底是怎么用的呢。我们是怎么通过java代码来读取xml文件的呢?
实际上,java对xml的读取有四种方式:DOM,SAX,JDOM,DOM4J。它们各有各的优劣,这里我们就不细嗦了,以DOM形式为例,上代码!(代码来源于秃头哥编程大佬的文章,并非我所写)
book.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<bookstore>
<book id = "1">
<name>Thinking in java</name>
<author>Bruce Eckel</author>
<year>2014</year>
</book>
<book id = "2" author = "liu">
<name>爱的供养</name>
<year>2004</year>
</book>
</bookstore>
package com.codeliu.dom;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* @author liu
* @version 创建时间:2018年3月24日 下午7:32:02
* 使用DOM读取XML文件的内容 DOMTest.java
*/
public class DOMTest {
public static void main(String[] args) {
// 创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 创建一个DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
// 使用parse方法解析xml文件
Document document = db.parse("book.xml");
NodeList nl = document.getElementsByTagName("book");
System.out.println("文件中包含有" + nl.getLength() + "本书");
for(int i = 0; i < nl.getLength(); i++) {
// 通过item(i)获取一个book节点
Node book = nl.item(i);
// 获取一个book节点的所有属性
NamedNodeMap nnm = book.getAttributes();
for(int j = 0; j < nnm.getLength(); j++) {
System.out.println(nnm.item(j).getNodeName() + ":" + nnm.item(j).getNodeValue());
}
NodeList childNodes = book.getChildNodes();
// 子节点包括空格换行在内
System.out.println("一个book节点下共有" + childNodes.getLength() + "个子节点");
for(int m = 0; m < childNodes.getLength(); m++) {
// 如果子节点是element类型的,就输出
if(childNodes.item(m).getNodeType() == Node.ELEMENT_NODE) {
System.out.println(childNodes.item(m).getNodeName() + ":" + childNodes.item(m).getFirstChild().getNodeValue());
}
}
}
}
catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

1084

被折叠的 条评论
为什么被折叠?



