ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

xml详解

2021-06-07 11:54:36  阅读:239  来源: 互联网

标签:xml XML 文件 DTD 详解 文档 属性 Schema


学习内容:

  1. XML的约束—DTD(*)
  2. XML的约束—Schema(*)

什么是XML约束
在XML技术里,可以编写一个文档(文件)来约束一个XML文档的书写规范,这称之为XML约束。
常用的约束技术
XML DTD
XML Schema

DTD约束快束入门

DTD(Document Type Definition),全称为文档类型定义

文件清单:book.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
    <书>
        <书名>Java培训教程</书名>
        <作者>老佟</作者>
        <售价>39.00元</售价>
    </书>
    <书>
        <书名>细说PHP</书名>
        <作者>峰哥</作者>
        <售价>99.00元</售价>
    </书>
</书架>

DTD文件应使用UTF-8,不能用GBK

文件清单:book.dtd

<!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>

编程校验XML文档正确性

IE5以上浏览器内置了XML解析工具:Microsort.XMLDOM,开发人员可以编写javascript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证。
创建xml文档解析器对象
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
开启xml校验
xmldoc.validateOnParse = "true";
装载xml文档
xmldoc.load( "book.xml“ );
获取错误信息
xmldoc.parseError.reason;  //解析出错的原因
xmldoc.parseError.line; //解析出错的行号

XML文件中引入DTD约束的两种方式

外部引入:
DTD约束作为一个单独的文件编写,在xml文件中引入
内部引入:
直接在XML文件内编写约束

外部引入:
DTD文件在本地
在xml文件中引用DTD的方式:
            <!DOCTYPE 文档根结点 SYSTEM "DTD文件">
          例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>
DTD文件在公用的网络(了解)
在xml文件中引用DTD的方式:
           <!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
             例如:<!DOCTYPE web-app PUBLIC 
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
引用DTD约束----内部引入
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>
]>
<书架>
    <书>
        <书名>Java培训教程</书名>
        <作者>老佟</作者>
        <售价>39.00元</售价>
    </书>
    ...
</书架>

元素定义(1)

在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:
    <!ELEMENT 元素名称 元素内容/元素类型> 
如为元素内容:则需要使用()括起来,如
<!ELEMENT 书架 (书名|作者|售价)*>
<!ELEMENT 书名 (#PCDATA)>
如为元素类型,则直接书写,DTD规范定义了如下几种类型:
EMPTY:用于定义空元素,例如<br/> <hr/>
ANY:表示元素内容为任意类型

元素定义( 2 )

元素内容中可以使用如下方式,描述内容的组成关系
用逗号分隔,表示内容的出现顺序必须与声明时一致。

属性定义1

xml文档中的标签属性需通过ATTLIST为其设置属性
语法格式:
    <!ATTLIST 元素名 
        属性名1 属性值类型 设置说明
        属性名2 属性值类型 设置说明
        ……
    >
属性声明举例:
<!ATTLIST 商品
    类别 CDATA #REQUIRED
    颜色 CDATA #IMPLIED
>
对应XML文件:
    <商品 类别="服装" 颜色="黄色">…</商品> 
    <商品 类别="服装">…</商品> 

属性定义2

设置说明:
REQUIRED:必须设置该属性
IMPLIED:可以设置也可以不设置
FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值
直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。
举例:

常用属性值类型

CDATA:表示属性值为普通文本字符串。
ENUMERATED (枚举)
ID

属性值类型ENUMERATED

属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)

<?xml version = "1.0" encoding="utf-8"?>
<!DOCTYPE 购物篮 [
    <!ELEMENT 购物篮 (肉+)>
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]> 
<购物篮>
    <肉 品种=“猪肉"/>
    <肉 品种="牛肉"/>
    <肉/>
</购物篮>

属性值类型 ID

表示属性的设置值为一个唯一值。
ID 属性的值只能由字母,下划线开始,不能出现空白字符

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 联系人列表 [
    <!ELEMENT 联系人列表 (联系人+)>
    <!ELEMENT 联系人 (姓名,EMAIL)>
    <!ELEMENT 姓名 (#PCDATA)>
    <!ELEMENT EMAIL (#PCDATA)>
    <!ATTLIST 联系人 编号 ID #REQUIRED>
]>


<联系人列表>
    <联系人 编号="a1">
        <姓名>张三</姓名>
        <EMAIL>zhang@it315.org</EMAIL>
     </联系人>
    <联系人 编号="a2">
        <姓名>李四</姓名>
        <EMAIL>li@it315.org</EMAIL>
    </联系人>
</联系人列表>

实体(Entity)定义

实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
在DTD定义中,一条

<!DOCTYPE person [
    <!ENTITY resume "I am a programmer1"> 
    <!ELEMENT person (#PCDATA)> 
    <!ATTLIST person name CDATA #REQUIRED>
]>
<person name="Tom">&resume;</person>

Schema约束快速入门

<?xml version="1.0" encoding="UTF-8" ?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.atguigu.cn"
            elementFormDefault="qualified">
    <element name="书架">
        <complexType>
            <sequence maxOccurs="unbounded">
                <element name="书">
                    <complexType>
                        <sequence>
                            <element name="书名" type="string" />
                            <element name="作者" type="string" />
                            <element name="售价" type="string" />
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>

后缀xsd文件中:
xmlns:用来引入约束文件。因为schema是w3c指定的,所以要指定w3c的约束文件,每个schema都需要一个id,这里被成为namespace,用targetNamespace来指定,值就是名字(随便起)。elementFormDefault=”qualified”意思是约束下面的全部节点,否则就仅约束根节点。
xml文件中:
xmlns:引入约束文件。就是自己定义的targetNamespace名字。
xmlns:xsi:给多个约束文件起别名,区分。
xsi:schemaLocation 前面加别名区分。这个是指定文件位置,格式是namespace+文件名

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

<书架 xmlns="http://www.atguigu.cn"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.atguigu.cn book.xsd">
    <书>
        <书名>JavaScript开发</书名>
        <作者>老佟</作者>
        <售价>28.00元</售价>
    </书>
</书架>

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
XML Schema VS DTD:
XML Schema符合XML语法结构。
DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
XML Schema对名称空间支持得非常好。
XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。

名称空间的概念

在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:

使用命名空间引入Schema

为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:

使用默认名称空间

基本格式:
    xmlns="URI"  
举例:
    <书架 xmlns="http://www.it315.org/xmlbook/schema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=“http://www.atguigu.com book.xsd">
        <书>
        <书名>JavaScript开发</书名>
        <作者>老佟</作者>
        <售价>28.00元</售价>
        </书>
    <书架>

引入多个XML Schema文档

文件清单:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>

<书架 xmlns="http://www.atguigu.com/xmlbook/schema" 
    xmlns:demo="http://www.atguigu.com/demo/schema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.atguigu.com/xmlbook/schema               http://www.atguigu.com/xmlbook.xsd 
        http://www.atguigu.com/demo/schema http://www.atguigu.com/demo.xsd">
    <书>
        <书名>JavaScript开发</书名>
        <作者>老佟</作者>
        <售价 demo:币种=”人民币”>28.00元</售价>
    </书>
</书架>

在XML Schema文档中声明名称空间

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               targetNamespace="http://www. atguigu.com"
               elementFormDefault="qualified">
<xs:schema>

targetNamespace用于指定schema文档中声明的元素关联到哪个名称空间。
elementFormDefault用于指定,是否将所有声明的元素和属性都关联到指定的命名空间, qualified代表是,unqualified代表只关联根元素

约束总结

  1. namespace
    相当于schema文件的id
  2. targetNamespace属性
    用来指定schema文件的namespace的值
  3. xmlns属性
    引入一个约束, 它的值是一个schema文件的namespace值
  4. schemaLocation属性
    用来指定引入的schema文件的位置

schema规范中:
1. 所有标签和属性都需要有schema文件来定义
2. 所有的schema文件都需要有一个id, 但在这里它叫namespace,
3. namespace的值由什么来指定?
由targetNamespace属性来指定, 它的值是一个url(很有可能不存在)
4. 如何引入一个Schema约束?
属性? : 用xmlns属性
属性值: 对应的schema文件的id(namespace值)
5. 如果引入的schema不是w3c组织定义, 必须指定schema文件的位置
6. schema文件的位置由什么属性来指定?
属性? : schemaLocation
属性值: namespace path
7. 如果引入了N个约束, 需要给n-1个取别名

标签:xml,XML,文件,DTD,详解,文档,属性,Schema
来源: https://blog.51cto.com/u_12784254/2875149

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有