无废话XML--XML细节
今天开始研究xml,其实在实际的开发中,我们参与到真正的XML开发并不是很多,最多写一个配置,但是我还是觉得很有必要把XML的知识整理一遍。作为基本的2种的数据交互载体(还有一个是json),基本的XML的规范还是应该要懂的,并不是单纯的去为了写一个配置去敲几行代码,至少应该把XML文档的解析和java对XML的处理要整理清楚了。 除了上面讲到的,其实还有一个很是普遍的情况来使用XML。比如说我们在撸码的时候,一些static final的属性或者字段(对应XML就是数据)我们不想硬码写4在代码中,最常用的就是2种方法:一种写在配置文件中,要不就是XML配置,要不就是properties配置,一种就是写在数据库中,个人觉得一些经常改变的配置这些完成可以封装成一个对象,然后统一存在数据库中,比如说一个页面的一些默认初始化信息等等。这样子在后期的时候,我们就根本不用来改项目,动都不用动,直接改数据库数据就好了,很是方便。
定义:XML(eXtensible Markup Language)是万维网联盟(World Wide Web Consortium W3C)定义的一种可扩展标志语言。可扩展性指允许用户按照XML规则自定义标记(tags 标签)。 强项:轻松表达多层结构的数据;可扩展。 优点:平台无关,语言无关。设计目标是描述数据并集中于数据的内容,与显示分离。 提醒:不能用XML来直接写网页。即便是包含了XML数据,依然要转换成HTML格式才能在浏览器上显示。 语法规则:1,XML文件有且仅有一个根标记,其他标记必须封装在根标记中,文件的标记必须形成树状结构。2,大小写敏感。3,标记的属性必须用""或''括起来。
<?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>
< ==== < > ==== > " ==== ” ' ==== ‘ & ==== & 自定义实体:在DTD中定义 <!ENTITY 实体标志 "实体内容">。 在xml中引用自定义实体,用 &实体标志; 代表实体内容。 另外,无法从键盘输入的字符可以使用字符引用,就是用字符的Unicode代码点来引用该字符。 以"&#x"开始字符引用,以分号结尾,x必须为小写,使用十六进制。如: = 表示等于号。 也可以使用字符引用来引用 <,>,',",& "。 查看字符的代码点(附件-> 系统工具-> 字符映射表)。
(1)属性的组成 属性是一个名值对,必须由名称和值组成,属性必须在标记的开始标记或空标记中声明,用"="为属性指定一个值。 语法如下: <标记名称 属性列表/> <标记名称 属性列表>XXX</标记名称> 例如: <桌子 width="40" height='100'/> (2)使有属性的原则 属性不体现数据的结构,只是数据的附加信息; 一个信息是作为一个标记的属性或子标记,取决于具体问题,不要因为属性的频繁使用破坏XML的数据结构。 下面是一个结构清晰的XML文件: <楼房 height="23m" width="12m"> <结构>混凝土</结构> <类别>商用</类别> </楼房> 下面是一个结构不清晰的XML文件: <楼房 height="23m" width="12m" 结构="混凝土" 建筑商="华海集团" 类别="商用"></楼房> 关于什么时候使用属性,什么时候使用子元素,严格上并没有规定:我们在自定义一个XML尽量的遵循一些默认的规则,比如说要是这个属性里面还有下一级,那么就应该使用子元素了。总体上的规则也是很好理解的:要是这个字段是表示前面那个标签的一个附属的说明的话,就应该用属性。要是这个字段和前面那个标签在结构上有明确的父子包含关系,就应该用子元素了。
名称空间的目的是有效的区分相同的标记,其实并不真实存在。 语法: 声明有前缀的名称空间 xmlns:前缀名=名称空间的名字 声明无前缀的名称空间 xmlns=名称空间的名字 (缺省) 注意:当且仅当它们的名字相同时称二个名称空间相同,也就是说,对于有前缀的名称空间,如果二个名称空间的名字相同,即使前缀不相同,也是相同的名称空间,返之同然。前缀只是方便引用而已。
以下附一份规格良好的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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |