(菜鸟级)XML及BeanUtils工具类的分享

这里首先分享一个常用的工具类: 是对JavaBean操作的BeanUtils; 

可能有部分的新手不明白JavaBean,它其实也就是一个类,一个专门用来存储数据的类,它本身并没其它的功能方法(getXxx,setXxx)除外.原因后面有讲.另外它还有几个必备的特点,这个类必须是public修饰的类;有一个public修饰的构造器;另外属性必须要提供setter和getter方法.

这里讲一下为什么要提供setter和getter方法: 

原因是:我们要通常都是通过BeanUtils工具类对JavaBean进行操作的时候,BeanUtils是给对象的属性进行赋值,成员变量的书上出现过很大名字,属性,字段等,但是在这里属性和字段还是有区别的,通常来说,我们一般使用eclipse进行开发,快捷方式生成的getter和setter后面衔接的是字段的首字母大写的形式,这种情况下属性和字段是相同的,也就是说什么是属性,取决于getter和setter方法的后面衔接的单词,衔接的单词首字母小写就是属性,而BeanUtils就是对属性名进行操作而不是字段进行操作,所以一般情况下不要去更改生成的getter和setter方法,如果更改了,你在使用的时候就要留意了.

BeanUtils大大简化了我们对一些代码的操作,说下几个常用的方法;

T  getProperty(Object obj, String name); //可以跟据指定对象的名称获取对象的属性,如果获取的属性名不存在,会抛出异常,因为它无法找到对应的属性
void setProperty(Ojbect obj, String name, T value) //给属性赋值,当如果设置的属性名不存在,是不会抛出异常的,当它无法找到该属性,不会赋值
copyProperties(Object dest,Object orig) //将一个对象的属性赋值给另一个对象,它会将两个对象共同拥有的数据进行赋值,如果没有该属性是不会赋值的
populate(Object obj,Map<String,Object>) //将map集合的数据赋值给对象,map集合的键对应的String类型,因为要明确是哪个字段,这个跟反射是一样的原理,因为你不可能写一个变量上去吧如果没引号,但是值可以是任意类型的
Map<String, String> describe(Object bean) //将对象的属性封装成一个Map集合对象,该集合的键值对都是String类型,这个跟上面的方法有些不一样,它的值是String类型的,如果对象中有属性是数组类型的等,它会取数组的第一个元素给值,因为值默认的就是String类型,并且还会在集合中添加一个全类名

来一个华立的分割线:System.out.print("----------------------------------------------------------------------------------------------------------------------------------");

说说XML: Extensible Markup Language,可拓展的标记语言

它是由W3C制定的用来描述数据结构的语言,样式跟

作用: 可以当成小型的数据库,进行存储数据

 可以用于在不同平台之间进行数据传输,因为平台之间的语法可能不相同,而XML正好解决了该问题

 我们常用的一些框架的配置也使用到了XML配置文件,能很好的提升软件的灵活性: 数据库的配置,JavaBean的配置以及struts,hibernate框架的配置

说说XML文件的组成部分及语法:

一个XML文件的组成由,声明,标签(元素),属性,注释,CDATA区域,转译符,处理指令组成

xml文件跟Java语言一样是严格区分大小写的,而且第一行定开头必须是声明,它的第一元素也是根元素,根元素只允许有一个,如果有多个元素并级,必须要被根元素包裹.

另外注释是不可以写在声明上的,声明必须处于第一行刚有说过.

一些新人常犯的注意事项:

元素名,不可以有空格,如<nam e> //这样解析器会认为空格及后面的都是该元素的内容进行解析,但是如果是<name > 这样子是没有问题的,还是一个name元素,但是我们都不这么写

属性值的必须要用引号引起来,可以是单引号也可以是双引号,但是不可以单双互引 如: <name id="001'>另外属性值后面是不能跟冒号的,因为冒号是命名空间的一个格式

标签开始必须有结束,但是空标签有点不一样,如<a></a> 空标签<a/>,另外标签的嵌套也是要成对的,不能交互嵌套

语法部分:

声明语法 格式<?xml version="1.0"encoding="utf-8"?> //version的版本有两种一种是1.0一种是1.1;该属性是固定的不能省略,encoding指定的码表可以是GBK,该属性可以省略,省略默认操作系统所属,但是为了阅读性不推荐.另外在一些开发工具,它所对应的码表会和声明的码表不一致,所以这个要自己留意下
标签语法: 格式<name></name>或者<br/> 
    属性与属性值语法: 格式<name id="001">
注释语法:格式<!-- 内容 --->
CDATA语法: 格式: <![CDATA[
 //该区域的内容,解析器是原样输出的
]]>
转译符语法: 常用的转义符,(转译符就是在xml文件中已经被赋予了特殊含义的,如果想原样属性,就要使用转译符) 
&lt;<
 &lt;<
&gt; >
&quot; ""
&apos;''

xml的文档约束:用来规定xml文件的内容该如何书写

常见的xml约束有两种: 一种是DTD约束;一种是Schema约束.DTD约束的优点是简单易操作,但是内容不够丰富,语法单一只能操作一些文本数据;而Schema约束优点可以操作更多的数据例如,Java的引用类型,但是它的使用比较复杂,语法丰富.

DTD的一般用于在struts和hibernate的配置文件中,该文件的格式是dtd;而Schema用于在一些Spring的框架配置及web的tomat配置文件中;另外Schema文件本身也是一个xml文件,它自身也被其它文件约束,这个我们不需要去理会,因为是W3C制定的约束,其实这两个文件与xml文件就像是Java中的类与对象关系,我们制定的xml文件必须符合约束文件的要求,否则就无法编写.

DTD全称是 Document Type Define  中文名是文档类型定义;它的声明由两种,一种是PUBLIC一种是SYSTEM

格式: <!DOCTYPE 根标签 SYSTEM "dtd URL">  //一般都是自己使用

格式:  <!DOCTYPE 根标签 PUBLIC "dtd文件描述"  "dtd URL">  //公共的,要在描述,写明来源,所有者及语言


DTD的文档声明有两种一种是外部引入,一种是内部写,但是目前都不使用内部的声明方法

DTD的一些语法:

 元素约束语法格式<!ELEMENT 元素名 元素的内容>

 元素的类别: (#PCDATA) 说明该元素名的内容可以是字符类型,也就是文本类型;EMPTY 说明该元素的内容可以为空;ANY 说明文档的内容可以是任意的类型

元素的内容修饰符: ?代表出现1次; *代表的是任意次数; +代表的是至少出现一次; () 用来给元素进行分组的; | 是用来规定内容在有哪几个; ,逗号是规定内容按照指定的顺序编写

这些就不上代码演示了.

元素的属性约束格式<!ATTList 元素名  

      属性名 属性类型 属性选项>

属性的类型分类: CDATA 指属性可以是字符类型;(enum1|enum2|enum3);  指属性在这几个中选其一; ID 指该属性在整个xml文档中唯一,并且不能是数字开头

属性的选项: #REQUIED: 指的是该属性必须要选择; #IMPLIED 该属性可以选择; #FIXED value: 该属性的值是固定的; 默认:就是该属性的值如果没有指定就是默认的,如果指定了就是指定的

Schema全称是 XML Schema Defined,后缀名为xsd,它本身也是一个xml文档,所以它也具备xml文档拥有的内容,它也被约束
这里要说下Schema的根元素是固定的,根元素就是Schema,它是被W3C约束的,这里不做介绍

在了解Schema约束前,先要明白两个概念:就是实例文档与约束文档的区别,

 |- 实例文档就是指的是xml文档,指我们根据约束编写的xml文件

|- 模式文档指的是用于约束的实例文档数据内容的文档,类似DTD,但是它和DTD不一样的就是它自身也是一个xml文件

既然说到Schema约束,首先要说下的就是命名空间的这个概念: 它类似与我们在Java开发中常使用的导包的操作.因为Schema约束也是一样的,当一个实例文档被多个约束文档约束的时候,而此时多个约束文档出现了相同的元素约束,这时候我们就要使用命名空间来指定该元素是受哪一个模式文档约束

在定义一个命名空间的时候我们会看到声明处有一个targetNamespace="URL地址"; 这个就是命名空间,它的地址是任意的,解析器并不会去查找该地址的信息,它的唯一的作用就是用来确保命名空间的唯一性,所以在定义命名空间的时候要确保该地址的唯一性

声明命名空间的有两种方式: 第一种是带有后缀的 xmlns: xs="URL地址" //引入之后使用该命名空间的元素需要带有命名空间的前缀

     第二种是没有带前缀的 xmlns="URL地址" //使用该命名空间的元素是不需要加前缀的,但是有一点要注意,这种不带命名空间的地址也称作默认的命名空间,默认的命名空间在一个xml文档中只能有一个,就像你导包的时候,,多个同名的类要使用的时候,就不能再导包了,必须要用全类名的形式


此处来个华立的分割线System.out.print("----------------------------------------------------------------------------------------------------------------------------")

XML的解析:之前我们之所以定义类xml文档以及一些书写注意事项,无非就是要通过利用Java技术将XML文档的内容解析到内存中获取数据这个过程就称为XML解析

XML的解析分为两种:一种是DOM解析;一种是SAX解析;这里主要详说下DOM解析

DOM解析的概念: DOM的全称是Document Object Model将XML文档加载到内存中生成一颗DOM数,树上的每一个元素都是一个节点对象,DOM解析的核心概念就是节点

它的优点就是保存了元素与元素之间的结构关系,这样就可以对DOM树上的元素进行增删改查操作;它的缺点就是:占用内存较高

SAX解析: Simple API for XML ,它是从上往下一行一行解析,解析完一行就释放资源

它的优点就是:速度快,占用内存低; 但是它无法对元素进行增删改查操作,只能读取,所以一般都用于内存较小的移动端上

说到解析就要介绍一个特别牛逼的解析开发包 Dom4j,它就是根据DOM解析进行处理的,是Java中运用常见的一个解析开发包

DOM树的组成部分: Document对象,Element对象,Attribute对象,Node对象,Text对象

Document对象: 通过new SAXReader().read("xml.url") 创建一个Document对象,它是解析的首要操作,是将整个XML文件加载到内存封装成一个Dom对象,它包含了整一个的XML文件的内容

获取到Document对象之后首先要获得根元素,方法getRootElement(),因为之前所说每一个的xml文档只有一个根元素,获取根元素之后才能对下面的元素进行操作

DOM树上的节点操作有一个特点,就是时copy一个文件夹一样,必须逐级去获取子元素

说下常用的一些方法

 |- Node常用的一些方法: getName() //获取节点的名字,Node节点是所有节点的父类,这个概念就在这里补充了

  |- NodeIterator() //迭代器,当前节点的包含的所有子节点

|- short getNodeType() //获取的是节点的类型,这个返回的短整型与底层的编写有关,但是我们一般通过操作Node节点的常量来控制节点类型

 |- final static ELEMENT_NODE//元素的节点类型

  |- final static ATTRIBUTE_NODE //属性节点类型

|- final static TEXT_NODE //文本节点类型

|- final static COMMENT_NODE 注释节点类型

注意事项需要留意: 在DOM对象中所有的内容是都是一个节点,包含了空格换行,tab键都是一个节点元素,所以针对这些没有必要的内容要进行相应的处理

Element对象的常用方法:

 |- elements(String name)

|- elements()

|-elements(String name)

|-getText()

|-getYestTrim()

|-elementText(String name)

|- elementTextTrim(String name)

|- Attribute(String name)

|- Attributes(String name)

|- AttributeValue(String name)

Attribute的特有方法:

 |- getName()

|-getValue()

XMLWriter写入XML文档

 创建XMLWriter对象 构造方法XMLWriter(OutputStream,OutputFormat)//第二参数指的是输出格式:两种一种是static creantPrettyPrint();一种是static creatCompactPrint()

常用的方法:

 writer(doc)写数据到xml文档中

DocumentHelper类,该类可以用来直接创建元素或生成一个文档






 













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值