java web学习:XML入门文档结构书写规则语义约束

Posted 安之ccy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java web学习:XML入门文档结构书写规则语义约束相关的知识,希望对你有一定的参考价值。

xml的介绍

1.全称:EXtensible Markup Language,翻译为:可扩展标记语言
2.编写xml就是编写标签(与html类似),扩展名为.xml
3.xml与html的区别:
(1) xml没有预定义标签,html有大量的预定义标签
(2) xml重在保存和传输数据,html用于显示数据

xml的作用

1.java程序的配置描述文件
2.用于保存程序产生的数据(导入导出数据)
3.网络间的数据传输,如webservice底层协议传输

xml书写语法规则

xml文档结构

(1) 第一行必须是xml声明,xml声明说明了xml文档的基本信息,包括版本号和字符集

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

其中,version代表版本号1.0/1.1
(2) 有且只有一个根节点
(3) 标签书写规则与html相同
xml文件创建步骤–src-new-other-xml-xml file(eclipse步骤)
如果使用idea。没有找到文档类型,可以参考这篇文章:idea如何创建xml文件

如果xml语法错误,除了编译器会报错之外,用浏览器打开这份xml文件,也会报错,不能看到正常的节点解析

xml标签书写规则

(1) 合法的标签名:
标签要有意义;
建议使用英文,小写字母,单词之间用短横线"-"分割;
建议多级标签之间不要存在重名的情况
(2) 适当的注释与缩进让xml更容易阅读
(3) 合理使用属性
属性提供有关元素的额外信息,如下方的id和category,属性值必须被引号包围,单引号和双引号均可,描述数据的信息应该使用元素,如下方的name、price、number

<shopping>
    <item id="1234567" category="fruit">
        <name>草莓</name>
        <price>20</price>
        <number>1</number>
    </item>
    <item id="1234568" category="snacks">
        <name>巧克力</name>
        <price>10</price>
        <number>1</number>
    </item>
</shopping>

(4) 特殊字符与CDATA标签
标签体中,出现"<“、”>“、”&"等特殊字符,会破坏文档结构,如:

“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。
“&” 会产生错误,因为解析器会把该字符解释为字符实体的开始。

<!-- 无效xml -->
<questions>
    <item>1+2<3?</item>
</questions>

使用浏览器打开,效果如下:

解决办法:
方法一:使用实体引用
xml中,有5个预定义的实体引用

实体引用对应符号说明
&lt;<小于
&gt;>大于
&amp;&
&apos;单引号
&quot;"双引号

注:&lt; 中,t 的前面是小写的L;实体引用后面的分号不能省略
就像这样:

<!-- 修改后的xml -->
<questions>
    <item>1+2&lt;3?</item>
</questions>

使用浏览器打开,效果如下:

(如果不想一个个处理特殊字符,可以使用CDATA标签)

方法二:使用CDATA标签

XML 文档中的所有文本均会被解析器解析。只有 CDATA 区段中的文本会被解析器忽略。
CDATA指的是,不应由xml解析器进行解析的文本数据。
<![CDATA[开始、由]]>结束,CDATA标签下的内容不做解析,而是原原本本地输出
CDATA的文本内容中不能出现字符串“]]>” CDATA不能再嵌套CDATA

就像这样:

<!-- 修改后的xml -->
<questions>
   <item>
   <![CDATA[
   1+2<3?
   ]]>
   </item>
</questions>

(5) 有序的子元素
在xml多层嵌套的子元素中,标签前后顺序应保持一致,便于阅读
比如之前的案例,item里嵌套了name、price、num子标签,且顺序一样,都是先name,再price,最后num

<shopping>
   <item id="1234567" category="fruit">
       <name>草莓</name>
       <price>20</price>
       <number>1</number>
   </item>
   <item id="1234568" category="snacks">
       <name>巧克力</name>
       <price>10</price>
       <number>1</number>
   </item>
</shopping>

xml语义约束(DTD与XML Schema的作用与区别)

xml文档结构正确,但可能不是有效的。xml语义约束就是用于规定xml文档中允许出现哪些元素。比如购物车xml文件不能出现与购物车不相关的标签。
xml语义约束有两种定义方式,分别是:DTD与XML Schema

DTD文档类型定义

DTD(Document Type Definition),文档类型定义,是一种简单易用的语义约束方式
DTD文件扩展名为.dtd

定义节点

利用DTD中的<!ELEMENT>标签,可以定义xml文档中允许出现的节点及数量,注意父节点后要有一个空格。比如

<!--定义food节点下只允许出现1个fruit子节点-->
<!ELEMENT food (fruit)>
<!--定义fruit节点下必须包含以下3个节点,且按顺序出现-->
<!ELEMENT fruit (name, price, num)>
<!--定义name节点-->
<!ELEMENT name (#PCDATA)>

定义节点数量

如果某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符,注意父节点后要有一个空格。

<!--定义food节点下最少出现1个fruit子节点-->
<!ELEMENT food (fruit+)>
<!--定义food节点下可能出现0~n个fruit子节点-->
<!ELEMENT food (fruit*)>
<!--定义food节点下最多出现1个fruit子节点-->
<!ELEMENT food (fruit?)>

定义属性列表

在 DTD 中,属性通过 ATTLIST 来进行声明

<!--语法如下-->
<!ATTLIST element-name attribute-name attribute-type attribute-value>
<!--DTD 实例1: payment节点可以有type属性,类型为CDATA,值为check-->
<!ATTLIST payment type CDATA "check">
<!--XML 实例1:-->
<payment type="check" />

<!--DTD 实例2: fruit节点可以有no属性,类型为CDATA,默认为空字符串-->
<!ATTLIST fruit no CDATA "">
<!--XML 实例2:-->
<fruit no="1233" />

总结来说:
每个使用到的节点、属性都需要在约束中声明,然后再使用;
父节点包含子节点的关系也要指明;
“叶子”节点需要指定类型,一般类型是PCDATA;属性要指定类型和默认值,一般类型是CDATA

关于属性类型、属性默认值等知识点,更具体的可以移步:菜鸟教程

引用DTD文件

在xml中使用<!DOCTYPE>标签来引用DTD文件(外部引用)

<!--书写格式-->
<!DOCTYPE root-element SYSTEM "filename">
<!--示例-->
<!DOCTYPE food SYSTEM "food.dtd">

创建DTD文档

右键src–new–other–XML目录下选择DTD file–点击next,给文件起名,建议与xml文件同名–点击finish(eclipse)
如果使用idea,找不到dtd文件模板,可以参考这篇文章:idea创建xml文件、dtd文件、xsd文件

创建好后,会默认加上xml文档的头

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

然后我们就可以在里面编写约束了
就像这样:

<!--dtd文件-->
<!--定义food节点下至少出现1个fruit子节点-->
<!ELEMENT food (fruit+)>
<!--定义fruit节点下必须包含以下3个节点,且按顺序出现-->
<!ELEMENT fruit (name, price, origin)>
<!--定义name节点标签体只能是文本,price也是-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!--定义fruit节点有一个no属性-->
<!ATTLIST fruit no CDATA "">
<!--定义origin节点下必须包含以下3个节点,且按顺序出现-->
<!ELEMENT origin (orino, oriname, oriadd)>
<!ELEMENT orino (#PCDATA)>
<!ELEMENT oriname (#PCDATA)>
<!ELEMENT oriadd (#PCDATA)>

xml文件是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE food SYSTEM "food.dtd">
<food >
    <fruit no="123">
        <name>草莓</name>
        <name>38</name>
        <origin>
            <orino>12138</name>
            <oriname>xx水果厂</name>
            <oriadd>xx路xx大厦xx层</name>
        </origin>
    </fruit>
    <fruit no="124">
        <name>苹果</name>
        <name>15</name>
        <origin>
            <orino>12138</name>
            <oriname>xx水果厂</name>
            <oriadd>xx路xx大厦xx层</name>
        </origin>
    </fruit>
</food>

XML Schema

XML Schema基于xml编写,提供了数据类型,支持命名空间,可针对未来的需求进行扩展,更加完善,功能更强大
文件扩展名为:.xsd
创建xsd文件:右键src–new–other–XML目录下的XML Schema file,点击next–命名后点击finish(eclipse)
如果使用idea,找不到xsd文件模板,可以参考这篇文章:idea创建xml文件、dtd文件、xsd文件

<!--targetNamespace和elementFormDefault目前没有用到,可以暂时删去-->
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
elementFormDefault="qualified"></schema>

complexType标签含义是复杂节点,包含子节点时必须使用这个标签
sequence标签代表序列,约束节点出现的顺序
element标签定义节点
attribute标签定义节点的属性
上方示例中的DTD文件可以改成这样:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">
<xs:element name="food">
<!--food为复杂标签-->
<xs:complexType>
    <xs:sequence>
        <!--fruit标签至少一个,至多9999个-->
        <xs:element name="fruit" minOccurs="1" maxOccurs="9999">
            <xs:complexType>
                <xs:sequence>
                    <!--name标签的数据类型为string-->
                    <xs:element name="name" type="xs:string"></xs:element>
                    <xs:element name="price" type="xs:decimal"></xs:element>
                    <!--origin为复杂标签-->
                    <xs:element name="origin">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="orino" type="xs:integer"></xs:element>
                                <xs:element name="oriname" type="xs:string"></xs:element>
                                <xs:element name="oriadd" type="xs:string"></xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <!--fruit有一个string类型的no属性-->
                <xs:attribute name="no" type="xs:string" use="required"></xs:attribute>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

xml中引入该xsd文件:

<?xml version="1.0" encoding="UTF-8" ?>
<food
        xmlns="http://www.w3schools.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.w3schools.com food.xsd">
    <fruit no="123">
        <name>草莓</name>
        <price>38</price>
        <origin>
            <orino>12138</orino>
            <oriname>xx水果厂</oriname>
            <oriadd>xx路xx大厦xx层</oriadd>
        </origin>
    </fruit>
    <fruit no="124">
        <name>苹果</name>
        <price>15</price>
        <origin>
            <orino>12138</orino>
            <oriname>xx水果厂</oriname>
            <oriadd>xx路xx大厦xx层</oriadd>
        </origin>
    </fruit>
</food>

其中,minOccurs="1"可省略,最少为1是默认的
xml schema还支持对值的限定,比如年龄,不能低于0,也不高于120,可以这样约束

<xs:element name="age">
    <xs:simpleType>
        <xs:restriction base="xs:integer">
            <xs:minIncluSive value="0"></xs:minIncluSive>
            <xs:maxIncluSive value="120"></xs:maxIncluSive>
        <xs:restriction>
    </xs:simpleType>
</xs:element>

如果输入的年龄不在0-120范围内,就会报错
还可以对一组值进行限定(枚举约束)、对一系列值进行限定(模式约束),详细内容,可以看:菜鸟教程

以上是关于java web学习:XML入门文档结构书写规则语义约束的主要内容,如果未能解决你的问题,请参考以下文章

java web学习:XML入门文档结构书写规则语义约束

java web学习:XML入门文档结构书写规则语义约束

从零开始的Java开发2-10-1 XML入门:XML文档语法规则DTD与XML SchemaDom4j与XPath表达式

史上最全idea插件开发入门实战(傻瓜式教程)

XML&Tomcat入门

web.xml文件书写规则