可扩展标记语言,设计宗旨是传输数据不是显示数据,xml没有与定义标签,都需要自定义标签。虽然可以传输数据,但是一般作为配置文件
Java中传统配置文件文.properties(键值对),struts、spring、hibernate都是基于xml配置文件的,可以更好地表述有关系的数据
Xml语法:和html不区分大小写不同,严谨区分大小写
标签:一定要有头有尾,区分大小写,html可以没有头,一个根标签
属性:一定要用引号包含,单双都可以,html不一定用引号,不能重复属性,html可以。
注释:和html一样
文档声明:版本是2000年的一直没变,默认utf-8解码,在eclipse中会按声明的码表进行编码,其它编辑器要注意使用和声明一样的码表
转义字符:和html差不多
CDATA块:可以让包含特殊字符的内容原样输出,省去了大量用转义字符的麻烦
处理指令:告诉xml解析器如何解析xml文档
告诉解析器引用了哪个css文件解析xml文件,href为空则用默认的样式。
Xml解析:
Dom解析:一次性把xml文件加载进内存空间形成document文档树,每个标签都封装为一个node对象进行操作
Dom解析工具jaxp(oracle官方的,没人用),jdom(非官方),dom4j(非官方,最好用,三大框架默认读取xml的工具)
在dom4j工具包中同样通过document对象获得其中各种对象,其中的每个标签都封装为一个节点对象进行操作,节点有三种element、attribute、text都是node的子接口,只有element节点有父子节点的关系。也会有JavaScript的dom编程中碰到的空文本和注释的现象。
//本质是这种关系
xml操作过程
1、 读取xml文件得到document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new file(“xml文件”));
2、 用得到的document对象取得文件信息,尤其是获得根标签
Document方法:
nodeIterator():返回当前节点下的子节点迭代器,实际只有一个节点,因为document下只有一个根节点,只有document和element有这个方法,返回的node对象可以用instanceof判断是三种节点中的哪个Iterator
it=doc.nodeIterator();
element roote=doc.Getrootelement():返回类型element,得到根标签对象
3、 通过根标签对象获得子标签对象
Element childe1=roote.element(“子标签名”);获得第一个子标签名的子标签对象
Iterator it=roote.elementiterator(“子标签名“);得到子标签名的迭代器
List elist=roote.elements();得到所有子标签对象
4、 通过标签对象获得标签属性
String value=childe1.attributevalue(“属性名”);得到指定名称的属性值,都是字符串类型
Attribute attobj=childe1.attribute (“属性名”);//得到指定名称的属性对象,attobj.getvalue()和
attobj.getname()得到属性信息
iterator it=childe1.attributeiterator();获得属性对象的迭代器
list attlist=childe1.attributes();获得属性对象的list
5、通过标签对象获得文本(就是标签体内的内容,注意会有空文本)
String text=childe1.gettext();//得到该标签全部空文本
String text=childe1.elementtext(“标签名”);//获得指定子标签名的文本
6、新建document对象
Document doc=documenthelper.createdocument();
7、新建标签
Element roote=doc.addelement(“标签名”);//注意:只能在document对象中创建一个根标签
Element childe=roote.addelement(“子标签名”);//创建子标签
8、增加属性
Attribute childa=childe.addattribute(“key”,”value”);//如果有同名key,则value覆盖之前的
9、修改属性值和文本
Childa.setvalue(“value”);//属性对象调用setvalue修改属性值
Childe.settext(“text”);//修改element对象文本
10、删除标签
Childe.detach();//三种node子接口对象都可以使用
Childe.getparent().remove(childe);//父对象的remove方法可以删除所有类型的子对象,用得少,已经有childe对象直接就可以用detach方法
11、将document对象写入文件
XMLWriter writer=new XMLWriter(new filewriter(“路径”));//fileoutputstream也可以
构造方法还可以加格式(两种):
Outputformat format=Outputformat.createcompactformat();紧凑没有空文档
Outputformat format=Outputformat.createprettyformat();有空文档填充成习惯的样式
Format.setencoding(“utf-8”);设置生成的xml文件的编码和xml文档声明的解码,完美解决中文乱码
XMLWriter writer=new XMLWriter(new fileoutputstream(“路径”),format)
Writer.write(document);
Writer.close();
Xpath技术:
使用dom4j查询层次很深的节点,非常麻烦!xpath就是解决这个问题的,xpath可以快速获取到需要的节点对象。Dom4j内置支持xpath
首先要导入dom4j的lib中的辅助包jaxen-1.1-beta-6.jar
Xpath方法:
Selectnodes(“xpath表达式”);//返回node的list
Selectsinglenode(“xpath表达式”);//返回单个node
Xpath表达式写法(通用,除了dom4j也可以用):
没有/和//代表从当前节点开始找
/开始,代表到一个元素的绝对路径。/可以理解为document对象,/aaa代表根标签对象aaa,/aaa/bbb代表根标签下的所有bbb子标签
//开始,代表所有满足//之后规则的元素(无论层级关系),//aaa/bbb代表所有父标签是aaa的bbb子标签
*代表任何元素
[]中的表达式用来进一步指定元素,/aaa/bbb[1]代表根元素aaa之下的第一个bbb元素。/aaa/bbb[last()]代表根元素aaa之下的最后一个bbb元素,没有first
@指定属性,//@id代表所有的id属性对象,//bbb[@id]代表所有有id属性的bbb标签对象,//bbb[@id=‘1’]代表所有属性id为1的bbb标签对象,//bbb[@*]代表所有有属性的bbb标签对象,//bbb[not(@*)]代表所有没有属性的bbb标签对象,//bbb[@id=‘1’ and @name=‘lfz’]
Text()文本对象,//aaa/text()代表aaa的文本对象
Dom4j和xpath技术同样可以用在严格语法的html中
Sax解析(只能读取):
加载一点,读取一点,处理一点,对内存要求低
Sax解析工具(oracle官方的,都用):内置带jdk中,org.xml.sax.*
Sax核心:
Defaulthandler:sax事件处理的基类,自己写子类继承它,重写以下方法设置处理方式
Defaulthandler关键方法:
Void startdocument()读到文档开始的时候调用
Void enddocument()读到文档结束的时候调用
Void startelement(string uri,string localname,string qname,Attributes attributes)读到开始标签的时候调用,qname表示开始标签的标签名,Attributes是一个类,用getqname(index)、getvalue(index或者qname)、getlength()配合可以取得里面所有的attribute对象的名字和值
Void endelement(string uri,string localname,string qname)读到结束标签的时候调用
Void characters(char[] ch,int start,int length)读到文本内容的时候调用,ch表示当前读完的xml中所有的文本内容,start表示当前文本内容的开始位置,length表示当前文本内容长度。
然后可以使用new string(ch,start,length)获得文本字符串
SAXParser类:用于读取解析xml文件,类似于saxreader,方法:Parse(file,defaulthandler)
Sax解析流程:
1、 获取saxparser对象
Saxparserfactory saxparserfactory=Saxparserfactory.newinstance();获取saxparser的工厂类,因为是工厂类,所以设计模式采用了单例工厂模式
Saxparser saxparser=saxparserfactory.newsaxparser();用saxparser工厂类生成saxparser类
2、调用parse方法
Saxparser.parse(new file(“xml文件”),new defaulthandler(){重写方法});xml文档上往下按照重写的方法逐个部分读取
Dom和sax区别:dom是一次加载全部xml文件进内存形成document对象,sax是分部分读取。Dom可以在document中随便操作,sax只能按照xml文件顺序从上向下操作。Dom是面向对象的,sax是基于事件的。
Xml约束:
要求:能够看懂约束内容,根据约束内容写出符合规则的xml文件
Xml语法:规范的xml文件的基本编写规则。(由w3c组织制定的)
Xml约束:规范xml文件数据内容格式的编写规则。(由开发者自行制定),在eclipse中根据xml基本语法和xml约束会检查格式,有错为红线
DTD约束:语法相对简单,功能单一,学习成本低
Scheme约束:语法复杂,功能强大,学习成本太高所以不作为重点,只看名称空间
DTD编写方式:
1、在[]中填写如下内容
2、本地文件系统导入
3、公共的外部导入,dtd文件在网络上,比如三大框架要求了xml格式,则要公共导入在框架网站上的dtd文件
标签类型约束:
类型有三种:EMPTY空标签、(#PCDATA)普通字符串(不能有子标签)、ANY任何内容
标签内容约束:
约束子元素顺序与个数,子元素+代表至少一次,子元素*代表任意次,子元素?代表最多一次,和正则规则一样
属性约束:
属性类型:CDATA字符数据,(en1|en2|..)表示属性任选其中的一个值,ID表示属性值(不能以数字开头)在xml文档中是唯一的。默认值有三个:#REQUIRED属性值是必须的,#IMPLIED属性不是必需的,#FIXED value属性非必须属性值是固定的。
阅读(3187) | 评论(0) | 转发(0) |