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个预定义的实体引用
实体引用 | 对应符号 | 说明 |
---|---|---|
< | < | 小于 |
> | > | 大于 |
& | & | 和 |
' | ’ | 单引号 |
" | " | 双引号 |
注:< 中,t 的前面是小写的L;实体引用后面的分号不能省略
就像这样:
<!-- 修改后的xml -->
<questions>
<item>1+2<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开发2-10-1 XML入门:XML文档语法规则DTD与XML SchemaDom4j与XPath表达式