XML(xml的语法,xml的解析,xml的约束)和工厂模式

  • A+
所属分类:Java 设计模式 XML JavaWeb

XML

概述

xml:可扩展标记语言 标签可以随便写

<aaa> <就是酷> <font>

</aaa> </就是酷> </font>

作用

可以作为项目的配置文件来使用

企业:.propertiies key=value键值对形式

.xml 层级结构形式

语法

xml的语法要比html更加严格

1 内容必须要有标签

2 有开始标签就一定要有结束标签

3 标签严格区分大小写

xml的组成

声明 标签元素 属性元素 注释 转义字符 cdata区域

声明:告诉别人自己是一个xml文件
格式:<?xml version="1.0" encoding="utf-8"?>
注意:声明必须放在第一行第一列
标签元素:自定义标签
格式:<xxx>内容</xxx>
属性元素: 在定义标签中可以自定义属性
格式:<xxx 属性名1=“属性值1” 属性名2=“属性值2” ....>内容</xxx>
注意:属性值必须得用双引号或者是单引号包裹
ps:可以用来指定某一组标签
注释:格式 <!-- --> 和html一样 可以出现在xml的任意地方 任意多次
转义字符: 空格:&nbsp;     < :&lt;     > :&gt;      &: &amp;
cdata区域(了解): 只要放入cdata区域的内容 任何特殊符号都不需要在转义了 都会给你原样进行输出
格式:<![CDATA[内容]]>

总结:

满足以下条件的xml文件

1 组成部分中语法的要求

2 必须有一个且只有一个根标签

称之为格式良好的xml文件

xml的解析

为什么要解析xml:为了获取xml中的内容

如何解析:DOM解析 SAX解析 PULL解析常见3种解析技术

DOM解析和SAX解析的区别(面试题)

DOM解析 
解析方式: 把整个xml文档加载到内存中形成一颗DOM树 这个DOM就是该xml标签的层级关系
优点: 因为dom树是层级关系 可以快速做增删改查
缺点: 可以因为文件的过大 造成内存溢出
SAX解析
解析方式: 逐行加载 逐行解析
优点: 不会因为文件的过大 造成内存溢出
缺点: 只能做查询 不能做增删改

解析xml的工具包

好处:不需要自己一步一步去实现解析过程,因为市面上给我们提供了封装好的解析工具包

Dom4j:比较简单的的解析开发包(掌握) 底层:DOM解析技术

JDom:与Dom4j类似

Jsoup:功能强大DOM方式的XML解析开发包,对HTML解析也更加的方便(爬虫技术)

使用Dom4j工具包解析xml的流程步骤

Dom4j工具包解析xml的流程:DOM解析技术
1 导包 dom4j-1.6.1.jar
2 编写一个xml
3 调用api进行解析

Xpath的方式解析xml(了解)---按照路径

使用DOM4J工具包解析:根据根标签找子标签的方式确实可以获取到xml的数据

但是如果子标签很多获取起来过于繁琐,所以我们可以也可以使用xpath的方式获取

Xpath的方式解析xml 基于dom4j(要先用dom4j获取到dom树才能操作)

使用步骤:

1 导包  dom4j-1.6.1.jar jaxen-1.1-beta-6.jar
2 特点:按照路径去查找
3 方法api
     selectSingleNode("路径"); 获取的是单一的值 是按照上下的顺序获取
     selectNodes("路径"); 获取是多个 返回值是list<Node>
4 路径的写法
     /:   从根路径开始   绝对路径表达式
     //:  指定的任意路径开始  全文搜索路径表达式
     @  条件筛选   谓语
          标签名[@属性名=属性值]

XML的约束(了解)

作用:

限制xml可以出现哪些标签 不能出现哪些标签
限制xml标签出现的次数
限制xml标签出现的顺序

应用场景:

自己定义一个框架的时候 需要编写对xml约束语法
框架提供了配置文件--要求用户按照约束语法的内容来写配置文件

要求:

看的懂dtd和schema的约束语法内容 根据约束语法内容会编写xml文件即可

约束的分类:dtd约束 schema约束

dtd约束:内部方式 外部方式

内部方式

直接在xml文档中书写
格式:<!DOCTYPE 根标签 [要约束的标签内容]>

外部方式

在外部创建一个约束文档  在需要的xml中引入约束文档
本地:格式:<!DOCTYPE 根元素名称 SYSTEM "约束文件的名称">   约束文档在本地电脑上
网络:格式:<!DOCTYPE 根元素名称 PUBLIC "约束文件的名称" "约束文件在网路上的地址">   约束文档在网络上

dtd约束的语法

标签元素:

声明元素:<!ELEMENT 元素名称 类别>
元素名称:要约束标签名称
类别: EMPTY   空
      (#PCDATA) 字符串
      ANY  任意内容
     (子元素名称 1,子元素名称 2,.....)   
简单元素:元素里面直接是文本内容
复杂元素:元素里面还有子元素
次数控制:如果是子元素,可以使用
     ?(可以出现0次或1次),
     *(可以出现0次或多次),
     +(出现1次或多次)来规定子元素出现的次数  
顺序控制:, 控制顺序
       | 元素或的关系 

元素属性:

属性:<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型 CDATA 字符串
默认值 #REQUIRED 必填
#IMPLIED  可选

schema约束

Schema与DTD区别:

1.DTD语法自成一派.Schema就是一个XML文档.
2.Schema可以更方便被XML的解析器所解析.
3.Schema提供了更多的数据类型.
4.Schema支持名称空间.
5.Schema的扩展名是xsd 

使用条件:需要创建外部xsd文件格式,然后在xml文档中引入该约束

外部xsd文件的格式:
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="约束文件的别名(名称空间)" 
    elementFormDefault="qualified">
<element>   
.....   
</schema>

在xml中引入外部的xsd约束文件:
<根标签名称
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="约束文件的别名"
    xsi:schemaLocation="约束文件的别名  约束文件名">    
</根标签>

工厂模式+反射+配置文件(理解)

概述

在程序中我们一直在使用实例化对象的方式(new 对象),这样的方式到底好不好呢?

答案是当然没有任何问题,写出来的代码清晰,但是有一个问题就是,如果以后需要修改,那么这样的方式是及其麻烦的。如果我们在代码中实例化对象有一百行乃至成千上万行,那么想修改成实例化其他对象的时候,带来的工作量也就不言而喻了。

那么,问题产生了,我们应该如何解决呢?由硬编码(写死的编码)修改成可灵活动态变化的代码,让程序自己决 定创建的对象会不会更好呢?

解决技术: 配置文件+反射+工厂 (IOC)

解决问题:可以不修改任何源码的情况下,实现多套实例对象功能

总结

xml

xml的作用:充当配置文件   .properties    .xml
1 xml的语法结构:比html严格很多
      1 声明   要求:必须第一行第一列  <?出来了
      2 标签元素  完全都是自定义 (咱们不关心写的什么标签,关心的是标签中的内容)
      3 标签元素的属性  在标签元素上可以写多个 多个之间用空格隔开  属性值必须用双引号或单引号包裹
      4 注释  和html一样 <!-- -->  可以出现声明以外的任何地方 出现多次
      5 转义字符  空格:&nbsp;   <:&lt    >:&gt  
      6 CDATA区:可以将一些特殊的符号原样输出(淘汰了)
2 xml的解析:为了获取xml中的标签内容      
常见的2中解析xml的技术:DOM解析  SAX解析
DOM解析和SAX解析
dom解析(企业)
    特点:一次性将xml文件加载到内存中形成dom树
    好处:dom树都是有标签的关系和层级结构组成 方便增删改查
    缺点:如果xml文件过大 容易造成内存溢出
SAX解析
    特点:逐行加载 逐行解析
    好处:不会造成内存溢出 
    缺点:只能做查询 不能做增删改
我们使用了别人提供的第三方工具包来解析xml:dom4j工具包  底层:  dom解析方式
API:
    *  获取解析器: new SAXReader()
    *  获取根标签:  document.getRootElement();
    *  获取子标签: 父标签元素.elements();
    *  获取标签属性:标签元素.attributeValue("属性名");
    *  获取标签名: 标签元素.getName();
    *  获取文本内容: 标签元素.getText();
xpath:基于dom4j
特点:根据路径找标签元素
/: 从根路径查找   绝对路径表达式
//:从xml全文直接查找  全文搜索路径表达式
@:做查询条件  谓语
api:
selectSingleNode("路径"); 获取的是单一的值 是按照上下的顺序获取
selectNodes("路径"); 获取是多个 返回值是list<Node>    
3 xml的约束
    作用:限制配置文件可以出现哪些标签  标签出现的顺序 标签出现的次数
    有2种方式来约束:dtd  schema
    dtd: 内部   外部(本地  网络)
    schema:外部
    dtd: 次数 ?(0~1) *(0~N)  +(1~N)     顺序: ,来界定顺序  | 来界定顺序
    schema: 内置的一些属性控制
    目标:看到约束 能够编写xml文档

配置文件+反射+工厂模式 spring框架ioc的底层

作用:在不修改源代码的基础上,可以套用多个实例对象  (解耦合)
编写:看代码
  • 资源分享QQ群
  • weinxin
  • 官方微信公众号
  • weinxin
沙海
C语言项目源码分享
C语言郝斌老师教程
美女讲师教你学C语言
Linux服务器网站环境安装

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: