XML学习笔记(二)

1、DTD

1.1、什么dtd

dtd(Document Type Definition):文档定义类型,描述xml文档的结构,它描述以下几个方面:

1.元素的定义规则以及元素与元素之间的关系

2.属性的规则

3.实体的规则

dtd与xml文档的关系:

类与对象

数据库中的表结构与数据库中的记录

1.2、为什么要使用dtd

有了dtd,对于每个xml文档而言就有了一个自身的描述文件

有了dtd,对不不同的组织的人可以通过dtd来进行交换数据

有了dtd,对于程序段而言,我们可以通过dtd来验证一个外部的xml文档是否有效

1.3、编写dtd的方式

内部dtd、外部dtd、内外部结合的dtd

1.3.1、内部dtd

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student [
    <!ELEMENT student (sid, sname, addr)>
    <!ELEMENT sid (#PCDATA)>
    <!ELEMENT sname (#PCDATA)>
    <!ELEMENT addr (#PCDATA)>
]>
<student>
    <sid>s01</sid>
    <sname>关羽</sname>
    <addr>南京</addr>
</student>

1.3.2、外部dtd

先编写一个demo04.dtd文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT student (sid, sname, addr)>
<!ELEMENT sid (#PCDATA)>
<!ELEMENT sname (#PCDATA)>
<!ELEMENT addr (#PCDATA)>

然后编写一个xml文件与上面的dtd进行关联

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student SYSTEM "demo04.dtd">
<student>
    <sid>s02</sid>
    <sname>曹操</sname>
    <addr></addr>
</student>

1.3.3、内外部结合的dtd

改写上面的代码

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT student (sid, sname, addr,age)>
<!ELEMENT sid (#PCDATA)>
<!ELEMENT sname (#PCDATA)>
<!ELEMENT addr (#PCDATA)>

以上dtd并没有定义age元素,我们将age元素的定义放在了内部中进行描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student SYSTEM "demo04.dtd" [
<!ELEMENT age (#PCDATA)>
]>
<student>
    <sid>s02</sid>
    <sname>曹操</sname>
    <addr>曹营</addr>
    <age>12</age>
</student>

1.4、元素的定义

元素定义的语法:

<!ELEMENT name content>

content有以下几种类型:

EMPTY:不能包含任何子元素和文本,但是它可以有属性(空元素)

ANY:可以包含任何dtd中定义的元素

#PCDATA:只能包含字符数据,不能包含任何子元素

纯元素类型:只能包含子元素,不能包含文本内容

混合类型:可以包含子元素和文本数据

1.4.1、EMPTY

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student [
    <!ELEMENT student (sid, sname, addr,hello)>
    <!ELEMENT sid (#PCDATA)>
    <!ELEMENT sname (#PCDATA)>
    <!ELEMENT addr (#PCDATA)>
    <!ELEMENT hello EMPTY>
]>
<student>
    <sid>s01</sid>
    <sname>关羽</sname>
    <addr>南京</addr>
    <hello/>
</student>

1.4.2、ANY

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student [
    <!ELEMENT student (sid, sname, addr,hello,world)>
    <!ELEMENT sid (#PCDATA)>
    <!ELEMENT sname (#PCDATA)>
    <!ELEMENT addr (#PCDATA)>
    <!ELEMENT hello EMPTY>
    <!ELEMENT world ANY>
]>
<student>
    <sid>s01</sid>
    <sname>关羽</sname>
    <addr>南京</addr>
    <hello/>
    <world>
        <student>
            <sid></sid>
            <sname></sname>
            <addr></addr>
            <hello></hello>
            <world></world>
        </student>
    </world>
</student>

对于ANY而言,在开发中很少使用。

1.4.3、纯元素类型

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student [
    <!ELEMENT student (sid+, sname?, addr,hello,world*)>
    <!ELEMENT sid (#PCDATA)>
    <!ELEMENT sname (#PCDATA)>
    <!ELEMENT addr (#PCDATA)>
    <!ELEMENT hello EMPTY>
    <!ELEMENT world ANY>
]>
<student>
    <!--
        +: 1-n个
        *:0-n个
        ?: 0或者1个
    -->
    <sid>s01</sid>
    <sid>s02</sid>
    <addr>南京</addr>
    <hello/>
</student>

1.4.4、混合类型

混合类型中可以放字符数据也可以放元素

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student [
    <!ELEMENT student (sid+, sname?, addr,hello,world*,helloworld)>
    <!ELEMENT sid (#PCDATA)>
    <!ELEMENT sname (#PCDATA)>
    <!ELEMENT addr (#PCDATA)>
    <!ELEMENT hello EMPTY>
    <!ELEMENT world ANY>
    <!ELEMENT helloworld (#PCDATA|info|say)*>
    <!ELEMENT info (#PCDATA)>
    <!ELEMENT say (#PCDATA)>
]>
<student>
    <!--
        +: 1-n个
        *:0-n个
        ?: 0或者1个
    -->
    <sid>s01</sid>
    <sid>s02</sid>

    <addr>南京</addr>
    <hello/>
    <helloworld>
        <info>关羽是输出</info><say>关羽牛逼</say>
    </helloworld>   
    </student>

1.5、属性

语法:

<!ATTLIST 元素的名称 属性名 类型 属性的特点>

类型:CDATA、ID、IDREF|IDREFS、枚举类型

属性的特点:#REQUIRED、#IMPLIED、#FIXED value、default value

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persons[
<!ELEMENT persons (person+)>
<!ELEMENT person EMPTY>
<!ATTLIST person name CDATA #REQUIRED>
<!ATTLIST person pid ID #REQUIRED>
<!ATTLIST person ptype CDATA #REQUIRED>
<!ATTLIST person parentID IDREFS #IMPLIED>
<!ATTLIST person 婚姻状态 (单身|离婚|结婚) #IMPLIED>
<!ATTLIST person age CDATA "15">
<!ATTLIST person sex CDATA #FIXED "男">
]>
<persons>
    <person name="貂蝉" 婚姻状态="结婚" pid="p01" ptype="mother"/>
    <person name="吕布" 婚姻状态="结婚" pid="p02" ptype="father"/>
    <person name="吕不韦" sex="男" age="16" 婚姻状态="单身" pid="p03" ptype="son" parentID="p02 p02"></person>
</persons>

1.6、实体

1.6.1、普通实体

实体的定义

<!ENTITY info "这是一个普通实体">

运用时:采用&实体名;

普通实体是定义在xml文件中,应用也在xml文件中

1.6.2、参数实体

参数实体它是定义在dtd文件中,应用在dtd文件中

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % 地址 "省份,城市,区">
<!ELEMENT person (name,age,%地址;)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 区 (#PCDATA)>

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "C:\Users\Administrator\Desktop\demo\dtd05.dtd">
<person>
    <name>张三</name>
    <age>15</age>
    <省份>江苏</省份>
    <城市>南京</城市>
    <区>秦淮区</区>
</person>

1.7、读取mybatis框架的dtd文件

<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>

<!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 (property*)>
<!ATTLIST objectWrapperFactory
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
>

2、命名空间

需求:

xml01文档

<?xml version = "1.0" encoding="utf-8" ?>
<table>
    <tr>
        <td>编号</td>
        <td>姓名</td>
    </tr>
</table>

xml02文档

<?xml version = "1.0" encoding="utf-8" ?>
<table>
    <name>mytable</name>
    <width>100</width>
    <length>90</length>
</table>

现在这2个xml文件在不同的文件中肯定是没有问题的,但是如果将2个xml中内容放在一起就会造成命名的冲突

<?xml version = "1.0" encoding="utf-8" ?>

<table>
    <tr>
        <td>编号</td>
        <td>姓名</td>
    </tr>
</table>
<table>
    <name>mytable</name>
    <width>100</width>
    <length>90</length>
</table>

那么如何解决->写上前缀

<?xml version = "1.0" encoding="utf-8" ?>
<h:table>
    <h:tr>
        <h:td>编号</h:td>
        <h:td>姓名</h:td>
    </h:tr>
</h:table>
<f:table>
    <f:name>mytable</f:name>
    <f:width>100</f:width>
    <f:length>90</f:length>
</f:table>

接下来为前缀加上命名空间约束

<?xml version = "1.0" encoding="utf-8" ?>
<h:table xmlns:h="http://×××w.w3c.com/hr/html4">
    <h:tr>
        <h:td>编号</h:td>
        <h:td>姓名</h:td>
    </h:tr>
</h:table>
<f:table xmlns:f="http://×××w.mytable.com/table">
    <f:name>mytable</f:name>
    <f:width>100</f:width>
    <f:length>90</f:length>
</f:table>

对于命名空间而言,不仅可以运用在元素上,它也可以运用在属性上面

命名空间就是为了解决命名冲突的问题

转载于:https://blog.51cto.com/11230344/2298266

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值