XML解析——SAX解析以及更方便的解析工具(JDOM、DOM4J)
XML主要用于数据交换,HTML则用于显示。
相对于DOM的树形解析,SAX采用的是顺序解析,这种解析方法可以快速地读取XML数据的方式。
SAX主要事件:
No. | 方法 | 类型 | 描述 |
1 | public void startDocument() throws SAXException | 普通 | 文档开始 |
2 | public void endDocument() throws SAXException | 普通 | 文档结束 |
3 |
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException |
普通 | 元素开始,可以取得元素的名称及元素的全部属性 |
4 | public void endElement(String uri,String localName,String qName) throws SAXException | 普通 | 元素结束,可以取得元素的名称及元素的全部属性 |
5 | public void characters(char[] ch,int start,int length) throws SAXException | 普通 | 元素内容 |
SAX解析步骤:
===========>startDocument()
<?xml version="1.0" encoding="GBK"?>
<addresslist> ===========>startElement("addresslist")
<linkman> ===========>startElement("linkman")
<name> ===========>startElement("name")
李四 ============>characters("李四")
</name> ============>endElement("name")
<email> ============>startElement("email")
111@qq.com ============>characters("111@qq.com")
</email> ============>endElement("email")
</linkman> ============>endElement("linkman")
</addresslist> ============>endElement("addresslist")
============>endDocument()
使用SAX解析器解析需要自己构造解析器:
package SAX; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MYSAX extends DefaultHandler{
public void startDocument() throws SAXException{
System.out.println("<?xml version=\"1.0\" encoding=\"GBK\"?>");
}
public void endDocument() throws SAXException{
System.out.println("\n文档读取结束!");
}
public void startElement(String url,String localName,String name,Attributes attributes) throws SAXException{
System.out.println("<");
System.out.println(name);
if(attributes!=null){
for(int x=0;x<attributes.getLength();x++){
System.out.println(""+attributes.getQName(x)+"=\""+attributes.getValue(x)+"\"");
}
}
System.out.println(">");
}
public void characters(char[] ch,int start,int length) throws SAXException{
System.out.println(new String(ch,start,length));
}
public void endElement(String uri,String localName,String name) throws SAXException{
System.out.println("</");
System.out.println(name);
System.out.println(">");
}
}
然后利用解析器读取XML文件:
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class TestSAX {
public static void main(String[] args) throws Exception{
SAXParserFactory factory=SAXParserFactory.newInstance(); //建立SAX解析器
SAXParser parser=factory.newSAXParser(); //构造解析器
parser.parse("d:"+File.separator+"output.xml",new MYSAX());
}
}
结合了SAX的快速读取的优点和DOM可以任意访问节点的优点而成的JDOM包:
生成一个XML文件的代码:
package SAX; import java.io.File;
import java.io.FileOutputStream;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class JDOM {
public static void main(String [] args){
Element addresslist = new Element("addresslist");
Element linkman = new Element("linkman");
Element name = new Element("name");
Element email = new Element("email");
Attribute Id = new Attribute("id","lxn");
Document doc = new Document(addresslist);
name.setText("lisi");
email.setText("123@qq.com");
name.setAttribute(Id);
linkman.addContent(name);
linkman.addContent(email);
addresslist.addContent(linkman);
XMLOutputter out = new XMLOutputter();
out.setFormat(out.getFormat().setEncoding("GBK"));
try{
out.output(doc,new FileOutputStream("d:"+File.separator+"addresslist.xml"));
}catch(Exception e){
e.printStackTrace();
}
}
}
使用JDOM读取XML文件:
package SAX; import java.io.File;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class JDOM{
public static void main(String[] args) throws Exception{
SAXBuilder builder = new SAXBuilder();
Document read_doc = builder.build("d:"+File.separator+"addresslist.xml");
Element stu = read_doc.getRootElement();
List list = stu.getChildren("linkman");
for(int i=0;i<list.size();i++){
Element e=(Element)list.get(i);
String name = e.getChildText("linkman");
String id = e.getChild("name").getAttribute("id").getValue();
String email = e.getChildText("email");
System.out.println("——联系人——");
System.out.println("姓名:"+name+",编号:"+id);
System.out.println("email:"+email);
System.out.println("————");
System.out.println();
}
}
}
运行结果:
——联系人——
姓名:null,编号:lxn
email:123@qq.com
————
XML解析——SAX解析以及更方便的解析工具(JDOM、DOM4J)的更多相关文章
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J
Java 四种解析 XML 的特点 1.DOM 解析: 形成了树结构,有助于更好的理解.掌握,且代码容易编写. 解析过程中,树结构保存在内存中,方便修改. 2.SAX 解析: 采用事件驱动模式,对内存 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- android xml解析 sax
1.简要概述 Android 各种文件都是xml格式的,还有标准的webservice返回的是xml文件,虽然现在的json使用在移动设备端越来越广泛,但是xml格式的解析感觉还是相当必要. 2.sa ...
- xml的SAX解析和dom解析的区别
一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...
- JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...
- 【文件处理】xml 文件 SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档 ...
- JAVA解析XML之SAX方式
JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParse ...
- javaweb学习总结十(xml解析<SAX以及DOM方式>)
一:XML解析技术 一般我们使用sun公司或者开源组织开发的工具包解析xml效率比较高. 1:jaxp解析xml,jaxp是sun公司开发的解析xml工具包 2:jaxp解析xml代码如下 a:获取d ...
随机推荐
- POJ 2528 Mayor's posters 离散化和线段树题解
本题就是要往墙上贴海报,问最后有多少可见的海报. 事实上本题的难点并非线段树,而是离散化. 由于数据非常大,直接按原始数据计算那么就会爆内存和时间的. 故此须要把数据离散化. 比方有海报1 6 7 ...
- Android 输入框限制字符输入数
有时候对Android的输入框有字符输入数量的限制,而且显示字符输入的数量.通过下面方式能够实现: 1.自己定义LimitNumEditText继承EditText import android.co ...
- windows下git的安装和使用
git到底是个什么东西,我这里就不介绍了,如果大家还有不懂的,可以去百度一下的.我这里给一个介绍的网址:git简介 这里在留一个地址http://baike.baidu.com/subv ...
- POJ 1274 二分图匹配
匈牙利算法 裸题 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> ...
- Debian9.5下sftp配置和scp用法
基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录). 1.如果只想让某些用户只能使用 sftp 操作文件, 而不能通过ssh进行服 ...
- bzoj 2456: mode 思维题 好题
题目描述: 给你一个 $n$ 个数的数列,其中某个数出现了超过 n div 2 次即众数,请你找出那个数.空间大小:1mb 题解:显然,我们是不能开任何数组的,此题专卡空间.然而我们要求的东西也十分简 ...
- phpstorm10安装并汉化
一.下载phpstorm 下载地址:https://pan.baidu.com/s/1R64ZROVP1ljGbYfCwWjwxA 二.一直点击下一步安装即可 注意:第3步的时候选择一下支持的后缀 三 ...
- 从Chrome源码看audio/video流媒体实现二(转)
第一篇主要介绍了Chrome加载音视频的缓冲控制机制和编解码基础,本篇将比较深入地介绍解码播放的过程.以Chromium 69版本做研究. 由于Chromium默认不能播放Mp4,所以需要需要改一下源 ...
- linux一个网卡添加多个虚IP
[root@localhost ~]# ifconfig bond0:0 10.0.0.202 netmask 255.255.255.255 broadcast 10.0.0.255 up 摘自:h ...
- Lenovo k860i 移植Android 4.4 cm11进度记录【下篇--实时更新中】
2014.8.24 k860i的cm11的移植在中断了近两三个月之后又开始继续了,进度记录的日志上一篇已经没什么写的了,就完结掉它吧,重新开一篇日志做下篇好了.最近的战况是,在scue同学的努力之下, ...