XML基础-DTD/Schema

  XML文件开发中几乎天天用,但很少去了解它的各种定义与原理,一篇博客虽然不能做到完全通透,但至少要让自己遇到bug不再慌乱。

  XML指可扩展语言,全称eXtensible MarkupLanguage,其宗旨是为了描述数据,而不是像HTML那样显示数据。目前遵循的是W3C组织于2000年发布的XML1.0规范。使用场景主要为描述数据和充当配置文件。

  • 基本语法

  文档声明:告知解析器这是一个XML文件,必须出现在文档第一行。最简单也是最常见的即:

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

其实不用encoding也可以,但为了编码统一,此处使用UTF-8

  • 元素(标签)
  1. XML语法严格,不能够省略结束标签
  2. XML中只能有一个根标签
  3. XML中不会忽略主体内容出现的空格与换行
  4. 元素(标签)的名称可以包含字母、数字、减号、下划线和英文句点,但必须遵守下面的一些规范:

    严格区分大小写/只能以字母或者下划线开头/名称字符之间不能有空格/名称字符之间不能使用冒号

  • 元素的属性

  一定要以单引号或者双引号引起来/元素中的属性不允许重复

  • 注释

  <! >

  但不允许出现在声明之前

  • CDATA

character data

<![CDATA[内容]]>

其中的内容都会被处理为字符串

  • 特殊字符的替代字符

&                    &amp

<                  &lt

>                  &gt

"                    &quot

'                     &apos

==============================>

  • 约束

    一个XML文件中的约束,主要是元素的定义,分为两种DTD(以.dtd结尾的文件,必须以UTF-8保存)和Schema(以.xsd结尾的文件)

  • DTD

  如果.dtd文件在XML外部(必须以UTF-8保存),如何导入呢?如果在本地,那么:

<!DOCTYPE 根元素 SYSTEM "dtd文件的路径">

  如果该文件在网络上,那么:

<!DOCTYPE 根元素 PUBLIC "dtd名称" "DTD文档的URL链接地址">

  也可以写在内部,对编码没有要求,此处仅了解。

  来个简单的实例:

book.dtd

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>              
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<!ATTLIST 书
    ISBN ID #REQUIRED
    COMMENT CDATA #IMPLIED 
    出版社 CDATA "指令汇公司"
    >
<!ENTITY copyright "指令汇公司">

book.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
    <书 ISBN="QWDERF01" 出版社="指令汇公司" COMMENT="a+">
        <书名>三体</书名>
        <作者>韩寒</作者>
        <售价>13</售价>
    </书>
</书架>

当然,这里面有很多细节,但因此处最终目的只是了解xml解析的用法,所以略过,如果要了解,可以查看官方文档。

==============================>

  • Schema约束

  .xsd自身就是一个xml文件,根节点为<Schema/>,通常需要把这个文件中声明的元素绑定到一个URI地址上,告诉编辑器,这个xml文档中编写的元素被谁约束,来自哪里。DTD并不能很细致地约束xml,于是出现了Schema,后者大有取代之势。

  在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示,用来区分字符相同但含义不同的标签。 例如<table/>到底表示"桌子"还是"表格",不同的命名空间对其的解释不同,保证自己需要的含义与命名空间所定义的含义一致就OK。另外,它的targetNamespace作用就是让别的xml引用时所标记的名称。

注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL根本没有指向任何文件,只是一个分配的名字。

  声明方式有两种,默认

xmlns="http://www.w3.org/2001/XMLSchema"

  显示:xmlns:别名

xmlns:tns="http://www.example.org/books"

  给出一份简易schema:books.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books"
    xmlns:tns="http://www.example.org/books" elementFormDefault="qualified">
    <element name="bookstore"></element>
</schema>

  这样的文档我们如何在xml文件中引用呢?

  首先是显示使用根元素,通过targetNamespace指向这个文档的命名空间,而后固定格式实例化,最后以xsi:localtion标记"名称1 位置1 名称2 位置2 ..."

<?xml version="1.0" encoding="UTF-8"?>
<bookstore xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/books books.xsd"></bookstore>

  xsi是默认值,如果还有自定义值,那么自定义空间所定义的标签,使用时需<别名:标签名/>法使用,举个例子:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p" xmlns="http://www.springframework.org/schema/beans"
    xmlns:c="http://www.springframework.org/schema/c" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/cache
        http://www.springframework.org/schema/cache/spring-cache.xsd"
    default-lazy-init="true">

    <description>Spring公共配置</description>

    <!-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 -->
    <context:annotation-config />

    <!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->
    <context:component-scan base-package="com.changjiang.test.jdbcTemplate" />

  这里context即为自定义的名称,所以使用标签是用到了<context:annotation-config/>。

  本篇就介绍到这里,实际上,这只是为xml解析和平时开发读懂xml文档所做的准备,了解即可。

 

转载于:https://www.cnblogs.com/bruceChan0018/p/5854480.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值