xml学习

作者: 鹏程1995 | 来源:发表于2020-02-13 10:23 被阅读0次

简介

起因

近期在看java时看到了公司的框架,公司自己的分布式jsf框架在配置时可以引入自己的jsf命名空间,感觉挺有意思的,就把xml的相关东西系统看了一下。

xml基本介绍

xml全称:Extenable Markup Language,即'可扩展标记语言',是一种长的有点像HTML的语言。

据说xml最初设计出来是用来传递数据的。最初也确实如此,在前后端数据传递和配置文件书写中大量用到了xml。在web开发中,也被用来简化数据的存储和共享

  • 现在前后端的数据传递使用json居多【根据我接触的项目】。
  • java EE的配置文件现在使用yaml语言居多,yaml语言有点像Python,在内容较多的情况下比xml配置文件结构清晰,还可以使用Markdown语言配置。
  • java Spring的配置现在提倡使用java配置而非xml,因为使用java配置更加方便简洁,而且配置的数据硬编码可以加密,但是xml加密不了。

综上所述,xml似乎有点过时了,但是在java EE的配置中xml仍然有它存在的意义。而且,xml的优点仍然很显著:跨平台和兼容性。xmltxt是两种可以在任何系统中兼容的文件格式。

本文内容

主要介绍xml的使用方法,会介绍xml的两种文档定义格式:DTDXML SchemaDTD略过,重点介绍XML Schema,因为貌似后者用的更多。

xml的基本用法

文档格式

xml的文档格式是树形的,即只能有一个根节点,上级和下级的数量对应是1:n

它大概长下面这样:

<?xml version="1.0" encoding="ISO-8859-1/UTF-8/GBK"?>
<root>
    <childA>
        <childAA>...</childAA>
        <childAB>...</childAB>
    </childA>
    <childB attributeA="...">
        <childBA>...</childBA>
    </childB>
</root>

所有的xml文档均由以下简单的模块构建而成:

  • 元素
  • 属性
  • 实体【&lt;之类的】
  • CDATA【Character Data】【字符数据,不解析,当做标记对待】
  • PCDATA【Parse Character Data】【和上边的区别在于这个会被解析】

注意以下几点:

  • 所有的标签必须关闭【<a></a>或者<a />都行】

  • 区分大小写

  • 特殊字符使用实体引用

    • 符号 实体表示 含义 解释
      < &lt; 小于号 less than
      > &gt; 大于号 greater than
      & &amp;
      ' &apos; 单引号
      " &quot; 双引号
  • xml空格会保留

  • 属性值要使用双引号

xml命名空间

xml中的元素名称、属性名称什么的都是开发者自己定义的,所以经常会出现同名。因此引入"命名空间"

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

格式为:

xmlns:namespace-prefix="namespaceURI"

当然,也可以使用默认命名空间:

<table xmlns="http://www.w3.org/TR/html4/">
   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>
</table>

两者结合也可以,下面是一个web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
<!-- xsi:schemaLocation 这个意思是 schemaLocation 是 xsi 作用域定义的属性(当然,这里和其他作用域的xsd文件指定有关)-->
</web-app>
  • 此文件的编码格式是UTF-8
  • 根元素是web-app
  • xmlns="http://xmlns.jcp.org/xml/ns/javaee"这一句的意思是:默认的命名空间是http://xmlns.jcp.org/xml/ns/javaee,也就是说如果在下面有一个<a></a>这样没有前缀的标签的话,就默认他是在此命名空间定义的。
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"这一句的意思是:定义了一个前缀指向了另一个命名空间,如果下面有一个<xsi:a></xsi:a>这样的标签,则a标签是在http://www.w3.org/2001/XMLSchema-instance中定义的
  • xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 这一句的意思是前面的命名空间 xsi 有个属性,叫``schemaLocation`,这里对这个属性进行了赋值。(值的意思是对应的xml命名空间和空间对应的标签规范的地址)

xml的格式定义

xml有两种格式定义语言,最开始是DTD

DTD

DTD是用来定义xml文档的,这里介绍DTD的基本使用。

按照之前我们说的xml由五种模块构成,我们同样按照这个思路来介绍DTD对这五种模块的定义。

元素

元素的声明如下:

<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>

<!--空元素-->
<!ELEMENT 元素名称 EMPTY>

<!---->
<!ELEMENT >

<!--只有PCDATA的元素-->
<!ELEMENT 元素名称 (#PCDATA)>

<!--带有任何内容的元素-->
<!ELEMENT 元素名称 ANY>

<!--带有子元素的元素-->
<!ELEMENT 元素名称 (子元素名称1,......)><!--元素出现且仅出现一次-->
<!ELEMENT 元素名称 (子元素名称1*,......)><!--星号表示出现零次一次或多次-->
<!ELEMENT 元素名称 (子元素名称1+,......)><!--加号表示出现一次或多次-->
<!ELEMENT 元素名称 (子元素名称1|子元素名称2,......)><!--出现一次1或者出现一次2-->



元素的定义如下:

<!--我们拿一个表单来举例吧-->
<!ELEMENT form (name,sex,birthday,home,hobby*,studyPlace|workPlace)>
<!ELEMENT name (#CDATA)>
<!ELEMENT sex (#CDATA)>
<!ELEMENT birthday (#CDATA)>
<!ELEMENT home (#CDATA)>
<!ELEMENT hobby (#CDATA)>
<!ELEMENT studyPlace (#CDATA)>
<!ELEMENT workPlace (#CDATA)>

属性

属性的声明规则如下:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>
<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>

属性类型选项:

类型 描述
CDATA character data
(a|b|c|....) 此值是列表中的一个值
ID 值为唯一的id
IDREF 值为另一个元素的id
IDREFS 值为其他id的列表
NMTOKEN 值为合法的XML名称
NMTOKENS 值为合法的XML名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的xml值

默认值参数:

解释
#REQUIRED 值是必须的
#IMPLIED 值不是必须的
#FIXED value 值是固定的value

实体

<!ENTITY 实体名称 "实体的值">
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<author>&writer;&copyright;</author>

XML Schema

XML Schema是基于xmlDTD替代者,也是用来描述xml文档结构的。它可以作为XSD来引用。springxml配置文件很多引用的就是.xsd文件。

XML Schema和DTD相比有很多优点:xml Schema是基于xml语言的,开发者不需要新学语言,可以直接使用xml的编辑器、解释进行操作

XSD 基本知识

schema声明

XSD的根元素是<schema>标签,一个schema声明看上去类似这样:

<?xml version="1.0"?>
 
<xs:schema xmlns:xs="A"
targetNamespace="B"
xmlns="C"
elementFormDefault="qualified">

...
...
</xs:schema>

解释如下:

  1. 本XSD文件xs前缀对应的命名空间是A URI
  2. 被此XSD定义的元素来自命名空间B URI
  3. 默认的命名空间是 C URI
  4. 任何XML实例文档所使用的且在此schema种声明过的元素必须被命名空间限定

在xml中引用schema

在xml中引用xml schema

<?xml version="1.0"?>

<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
代码解释
xmlns="http://www.w3school.com.cn"

默认命名空间是这个URI

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

加了xsi前缀的元素/属性的命名空间是这个URI,加这个是为了能使用下面的schemaLocation属性。

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

此属性有两个值,一个是需要使用的命名空间,第二个值是提供命名空间使用的xml schema的位置

XSD 简单类型

XSD 元素

XSD元素的定义如下:

<xs:element name="xxx" type="yyy"/>

这里定义的都是简单的元素,又叫简易元素,它仅包含文本,不包含其他元素或者属性。文本指的是常见类型或者个人自定义类型。

其中type有以下值:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

简易元素还可以加其他的限制:

<xs:element name="名称" type="类型" default="默认值" />
<xs:element name="名称" type="类型" fixed="固定值">
    

XSD 属性

属性定义语句如下:

<xs:attribute name="属性名" type="属性类型" default="默认值"/>
<xs:attribute name="属性名" type="属性类型" fixed="固定值"/>

属性类型和上面元素类型的取值范围一样。

XSD 限定

restriction用于为xml元素/属性定义可接受的值。

对值的限定
<xs:element name="age">

<xs:simpleType>
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="120"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 
对一组值的限定
<xs:element name="car">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 
<xs:element name="car" type="carType"/>

<xs:simpleType name="carType"><!--这样限定就可以被其他元素复用了-->
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>
正则表达式的限定
<xs:element name="letter">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-z]"/><!--正则表达式的东西-->
  </xs:restriction>
</xs:simpleType>

</xs:element> 
对空白字符的限定
<xs:element name="address">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="preserve"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 

preserve 表示对元素值中的空格、回车、换行、制表符进行保留处理。

<xs:element name="address">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="replace"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 

replace 表示对元素值中的空格、回车、换行、制表符进行移除处理

<xs:element name="address">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="collapse"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 

collapse 表示将所有的空白字符替换成一个空格【连续的多个空格也换成一个空格】

对长度的限定
xs:element name="password">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:length value="8"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 


<xs:element name="password">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:minLength value="5"/>
    <xs:maxLength value="8"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 

数据类型限定

限定 描述
enumeration 定义可接受值的列表
fractuinDigits 定义可接受的最大的小数位数
length 定义所允许的字符或者列表项目的精确数目
maxExclusive 定义数值上线,不包括
minExclusive 定义数值下线,不包括
maxInclusive 定义数值上线,包括
minInclusive 定义数值下线,包括
maxLength 定义所允许的字符或者列表项目的最大数目
minLength 定义所允许的字符或者列表项目的最小数目
pattern 定义可接受的正则表达式
totalDigits 定义所允许的阿拉伯数字的精确位数
whithSpace 定义空白字符的处理方式

XSD 复杂类型

复合元素指的是包含其他元素/属性的xml元素

复合元素类型:

  1. 空元素
  2. 包含其他元素的元素
  3. 仅包含文本的元素
  4. 包含元素和文本的元素

复杂类型元素

<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>


<!--下面的可以复用-->
<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>


<!--也可以继续扩展-->
<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="fullpersoninfo">
  <xs:complexContent>
    <xs:extension base="personinfo">
      <xs:sequence>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="city" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

混合内容、指示器

有七种指示器:

Order 指示器:【规定元素出现次序】
  • All【任意次序、但都出现一次】
  • Choice【n选1】
  • Sequence【按顺序、都出现一次】
<xs:element name="person">
  <xs:complexType>
    <xs:all>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>
<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
Occurrence 指示器:【规定元素出现频率】
  • maxOccurs
  • minOccurs
<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string"
      maxOccurs="10" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
Group 指示器:【批量定义元素】
  • Group name【定义元素】
  • attributeGroup name【定义属性】
<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>
<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

相关文章

  • 学习XML

    一XML前导 教学链接:http://click.aliyun.com/m/51383/ 对XML最好的...

  • xml学习

    简介 起因 近期在看java时看到了公司的框架,公司自己的分布式jsf框架在配置时可以引入自己的jsf命名空间,感...

  • 3/30day22_XML_XML约束

    day22_XML_XML约束 思维导图 复习 今日内容 XML XML约束 XML的学习 XML概念 XML的介...

  • XML语言初识

    xml语言简介: 1,什么是xml,为什么学习xml xml全称是Extensible Markup Langua...

  • spring xml的bean提取 源码学习

    上篇Spring xml解析 源码学习已经细说了spring是如何解析xml文件的,现在就来学习下如何把xml的元...

  • 2018-10-24

    学习XML用法

  • XML入门

    XML笔记 首先:学习XML需要有一定的HTML和JavaScript的基础 一、什么是XML XML是可扩展标记...

  • XML学习笔记

    XML XML仅仅是纯文本,被设计用来结构化、存储以及传输信息 没有预定义标签,可以拥有自己的标签 不会替代HTM...

  • XML学习笔记

    一. XML的概念 XML:eXtensible Markup Language,可扩展标记语言。 可扩展的含...

  • XML学习总结

    不知道你们发现没有,网页的前面几行都有这么一行 其实这个就是对dtd文件,那dtd文件有什么用处呢? dtd定义:...

网友评论

      本文标题:xml学习

      本文链接:https://www.haomeiwen.com/subject/gawxfhtx.html