java解析XML(sax解析)
⽂章⽬录
XML相关概念:
XML是什么:
  XML:X (extensible: 可扩展的) M (markup 标记/标签) L (language 语⾔);可扩展的标记语⾔!
XML的作⽤:
1. 存:作为存储⽂件,例如:单机游戏中的等级,装备等等;因为有时使⽤数据库太⼤,⽽普通⽂件太慢,所以采⽤xml⽂件保存软件中
的数据!
2. 传:代替数据包进⾏⽹络上传递数据。
3. 作为配置⽂件。
XML的特点:
1. 平台⽆关性(windows, linux), 独⽴的语⾔
2. ⼤多数语⾔都⽀持XML
3. xml具有⾃我描述性(内容⾃定义) :
html⽂件中,所有元素(标签) 都是官⽅定义好的,我们直接引⽤;但在 xml⽂件中,所有元素都是我们⾃⼰定义。
XML的语法规则:
1. xml ⽂件必须有根元素
2. xml元素(标签)有开必有合(结束标签)! .
3. xml 元素对⼤⼩写敏感
4. xml元素必须正确的嵌套
5. xml 元素的属性必须加引号(单引双引都可以)
CDATA区
  在CDATA区中书写特殊符号时,忽略其本性,变成普通的字符串。
  如下CDATA中的字符串‘10<5’,为了避免将字符串中的‘<’号当成标签部分,所以将整个字符串放⼊CDATA区。
<?xml version="1.0" encoding= "UTF-8"?>
<student >
<xx><![CDATA[ 10<5 ]]></xx>
</student >
DTD⽂件
DTD 的全称: Document Type Definition⽂档类型定 义
DTD 的⽬的:帮助你编写合法的代码
DTD和XML之间的关系:当XML引⼊⼀个DTD⽂件时,就不可以再⾃定义标签,因为DTD⽂件⾥已经定义好,只需要给标签添加内容即可。有点类似于类和对象的关系。
XSD⽂件
xsd 是xml结构定义(XML Schemas Definition)
xsd 是dtd的替代品,⽐dtd⾼端;实现和dtd相同的功能。
xsd的优点:
1. xsd 的代码基于xml,没有专门的语法,和xml⼀样的解析和处理,DTD有⾃⼰独⽴的语法。
2. xsd⽀持⼀系列的数 据类型。
解析XML:
解析xml的四种⽅式:
1. DOM解析
dom 解析的原理解析xml的时候,把⽂档中的所有元素按照其出 现的层次关系,在内存中构造出树形结构.
dom的优点就是可以遍历和修改节点的内容
缺点是内存压⼒较⼤, 解析较慢
2. SAX 解析
● 是⼀种xml 解析的替代⽅法
● 相对⽐dom ⽅式,sax 是⼀种速度更快,更有效的⽅法 ● 不能修改节点内容
3. JDOM解析
● 仅适⽤具体的类,⽽不⽤接⼝,不灵活
4. DOM4J 解析(最常⽤)
● JDOM的⼀种智能的分⽀,合并了许多超出基本XML⽂档的功能
● 著名的底层框架hibernate就是⽤dom4j来解析。
四种⽅式的分析:
  前两种属于基础⽅法,是官⽅提供的与平台⽆关的解析⽅式。
  后两种属于扩展⽅法,他们是在基础的⽅法之上扩展出来的,只适⽤于java平台。
  dom4j性能最⾼,其次是SAX,、dom和jdom表现不好(解析 10兆⼤⼩的xml⽂件,就内存溢出了。)
SAX 解析⽅法
例⼀ sax解析的步骤
XML⽂件内容如下:
<?xml version= "1.0" encoding= "UTF-8"?>
<persons>
<person>
<name>⾄尊宝</name>
<age> 9000</age>
</person>
</persons>
java代码如下:
使用dom4j解析xml文件
package xml;
import java.io.IOException;
l.parsers.ParserConfigurationException;
l.parsers.SAXParser;
l.parsers.SAXParserFactory;
l.sax.Attributes;
l.sax.SAXException;
l.sax.helpers.DefaultHandler;
/*
* SAX解析流程
*/
public class XmlTest01 {
public static void main(String[] args)throws Exception {
//SAX解析
//1、获取解析⼯⼚
SAXParserFactory wInstance();
//2、从解析⼯⼚获取解析器
SAXParser parse =wSAXParser();
//3、编写处理器
//4、加载⽂档Document注册处理器
PHandler handler=new PHandler();
//5.解析
parse.parse(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("l")
,handler );
}
}
class PHandler extends DefaultHandler{
@Override
//解析开始时运⾏
public void startDocument()throws SAXException {
System.out.println("---解析⽂档开始---");
}
@Override
//读取到标签时,获取标签参数运⾏
public void startElement(String uri, String localName, String qName,
Attributes attributes)throws SAXException {
System.out.println(qName+"-->解析开始");
}
@Override
//⽤于读取内容
public void characters(char[] ch,int start,int length)throws SAXException {  String contents =new String(ch, start, length).trim();//去掉两边的空格
String contents =new String(ch, start, length).trim();//去掉两边的空格
if(contents.length()>0){
System.out.println("内容为->"+contents);
}else{//碰到空格
System.out.println("内容为->"+"空");
}
}
@Override
//读取到结束标签时,运⾏
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println(qName+"-->解析结束");
}
@Override
//⽂档解析结束时,即读取到根标签的结束符时,运⾏
public void endDocument()throws SAXException {
System.out.println("---解析⽂档结束---");
}
}
运⾏结果:
—解析⽂档开始—
persons–>解析开始
内容为->空
person–>解析开始
内容为->空
name–>解析开始
内容为->⾄尊宝
name–>解析结束
内容为->空
age–>解析开始
内容为->9000
age–>解析结束
内容为->空
person–>解析结束
内容为->空
persons–>解析结束
—解析⽂档结束—
结果解析:
  SAX 解析⽅法是按照流的⽅式进⾏,从上到下依次进⾏读取。有些内容为空是因为写标签时格式的缩进导致的。
例⼆ sax解析XML并保存数据
XML⽂件内容如下:
<?xml version= "1.0" encoding= "UTF-8"?>
<persons>
<person>
<name>⾄尊宝</name>
<age> 9000</age>
</person>
<person>
<name>⽩晶晶</name>
<age> 600</age>
</person>
</persons>
Person类代码如下:
package xml;
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
super();
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
sax解析代码如下:
package xml;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
l.parsers.ParserConfigurationException; l.parsers.SAXParser;
l.parsers.SAXParserFactory;
l.sax.Attributes;
l.sax.SAXException;
l.sax.helpers.DefaultHandler;
/*
* SAX解析流程
*/
public class XmlTest02 {
public static void main(String[] args)throws Exception {
//SAX解析
//1、获取解析⼯⼚
SAXParserFactory wInstance(); //2、从解析⼯⼚获取解析器
SAXParser parse =wSAXParser();
//3、编写处理器
//4、加载⽂档Document注册处理器
PersonHandler handler=new PersonHandler();
/
/5.解析
parse.parse(Thread.currentThread().getContextClassLoader() .getResourceAsStream("l")
,handler );
//读取数据
List<Person> persons = Persons();
for(Person p:persons){

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。