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 ...
随机推荐
- iPhone4怎样鉴别翻新机
加入杂志 步骤 1 2 3 4 5 6 由于iPhong4s的不给力,中国内地上市时间又尚未确定,造成近期iPhone4的价格涨了一大截,随之而来的就是大量的翻新机出现在市场上,那么 怎样判断自己手中 ...
- 最快的方式清除Chrome浏览器DNS缓存
最快的方式就是直接数据url,然后清除不须要的dns缓存. chrome://net-internals/#dns 一般步骤.要经过下列几项. Chrome - > 扳手 - > 选项 - ...
- sass05 数据类型,数据运算
/*! 数字类型 */ $n1: 1.2; $n2: 12; $n3: 14px; p{ font-size: $n3; } /*! 字符串类型*/ $s1: container; $s2: 'con ...
- jsp出现错误can not find the tag directory /web-inf/tags
百度google了一大圈没找到中文答案,无奈之下硬着头皮看了一个英文答案http://stackoverflow.com/questions/11502703/eclipse-can-not-find ...
- centos7 安装swftools Apache_OpenOffice
centos7 yum -y install wget wget http://www.swftools.org/swftools-0.9.2.tar.gz tar -xf swftools-.tar ...
- POJ 2828 线段树 逆序插入
思路: 1.线段树 逆着插入就OK了 2.块状链表 (可是我并不会写) //By SiriusRen #include <cstdio> #include <cstring> ...
- js动态创建 select选择框
document.body.onclick = function(){ if(document.getElementById('vselect') === null){ document.body.i ...
- 记intel杯比赛中各种bug与debug【其五】:朴素贝叶斯分类器的实现和针对性的优化
咱这个项目最主要的就是这个了 贝叶斯分类器用于做可以统计概率的二元分类 典型的例子就是垃圾邮件过滤 理论基础 对于贝叶斯算法,这里附上两个链接,便于理解: 朴素贝叶斯分类器的应用-阮一峰的网络日志 基 ...
- hdu 5412 CRB and Queries(整体二分)
题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...
- Unity 实现Log实时输出到屏幕或控制台上<二>
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/49884507 作者:car ...