Java解析XMl文件之SAX和DOm方法
如题,这两种方法的jar包都在jdk中,不需要下载。
先来说下目录结构:

首先建一个Peron类封装person.xml的属性;DomParseService和SaxParseService分别为两种解析方法的服务类。最后TestXml为测试类。
Person.xml如下:
<?xml version="1.0" encoding="gbk"?>
<Persons>
<Person id="1">
<name>zhangsan</name>
<sex>男</sex>
<age>30</age>
</Person>
<Person id="2">
<name>lisi</name>
<sex>女</sex>
<age>20</age>
</Person>
</Persons>

- SAX方法:
public class SaxParseService extends DefaultHandler {
private List<Person> mPersons = null;
private Person mPerson = null;
private String m_preTag = null;
public List<Person> getPersons(InputStream xmlStream)
throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SaxParseService handler = new SaxParseService();
parser.parse(xmlStream, handler);
return handler.getPersons();
}
private List<Person> getPersons() {
return mPersons;
}
@Override
public void startDocument() throws SAXException {
mPersons = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("Person".equals(qName)) {
mPerson = new Person();
mPerson.setId(Integer.parseInt(attributes.getValue(0)));
}
m_preTag = qName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("Person".equals(qName)) {
mPersons.add(mPerson);
mPerson = null;
}
m_preTag = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (m_preTag != null) {
String content = new String(ch, start, length);
if ("name".equals(m_preTag)) {
mPerson.setName(content);
} else if ("sex".equals(m_preTag)) {
mPerson.setSex(content);
} else if ("age".equals(m_preTag)) {
mPerson.setAge(Integer.parseInt(content));
}
}
}
}
- DOM方法:
public class DomParseService {
public List<Person> getPersons(InputStream is)
throws ParserConfigurationException, SAXException, IOException {
List<Person> mPersons = new ArrayList<Person>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document element = builder.parse(is);
NodeList PersonNodes = element.getElementsByTagName("Person");
for (int i = 0; i < PersonNodes.getLength(); i++) {
Element PersonElement = (Element) PersonNodes.item(i);
Person mPerson = new Person();
mPerson.setId(Integer.parseInt(PersonElement.getAttribute("id")));
NodeList ChildNodes = PersonElement.getChildNodes();
for (int j = 0; j < ChildNodes.getLength(); j++) {
if (ChildNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
if("name".equals(ChildNodes.item(j).getNodeName())){
mPerson.setName(ChildNodes.item(j).getFirstChild().getNodeValue());
}else if("sex".equals(ChildNodes.item(j).getNodeName())){
mPerson.setSex(ChildNodes.item(j).getFirstChild().getNodeValue());
}else if("age".equals(ChildNodes.item(j).getNodeName())){
mPerson.setAge(Integer.parseInt(ChildNodes.item(j).getFirstChild().getNodeValue()));
}
}
}
mPersons.add(mPerson);
}
return mPersons;
}
}
测试类如下。里面正对SAX和DOM分别写了两个方法:
public class TestXml {
public static void main(String[] args) {
SaxParse();
DomParse();
}
public static void DomParse() {
DomParseService dps=new DomParseService();
try {
List<Person> mPersons=dps.getPersons(new FileInputStream(new File("e:/Person.xml")));
for(Person p:mPersons){
System.out.println(p.getName());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void SaxParse() {
SaxParseService sps=new SaxParseService();
try {
List<Person> Persons=sps.getPersons(new FileInputStream(new File("e:/Person.xml")));
for(Person p:Persons){
System.out.println(p.getName());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java解析XMl文件之SAX和DOm方法的更多相关文章
- java解析XML文件四种方法之引入源文件
1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Documen ...
- Java解析xml文件遇到特殊符号&会出现异常的解决方案
文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...
- java解析xml文件并输出
使用java解析xml文件,通过dom4j,代码运行前需先导入dom4j架包. ParseXml类代码如下: import java.io.File; import java.util.ArrayLi ...
- 使用Java解析XML文件或XML字符串的例子
转: 使用Java解析XML文件或XML字符串的例子 2017年09月16日 11:36:18 inter_peng 阅读数:4561 标签: JavaXML-Parserdom4j 更多 个人分类: ...
- 转载 VC轻松解析XML文件 - CMarkup类的使用方法
VC轻松解析XML文件 - CMarkup类的使用方法http://www.cctry.com/thread-3866-1-1.html VC解析XML文件的工具有很多,CMarkup, tinyXM ...
- JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...
- Java解析XML文档(简单实例)——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...
- Java解析XML文件的方式
在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求.一般来讲,有基于DOM树和SAX的两种解析xml文件的方式 ...
- 关于java解析xml文件出现的问题
DOM解析xml文件 问题1:导入javax.xml.parsers.DocumentBuilderFactory出现问题,如图: 解决办法是:由于创建工程时有个默认的jre,重新创建工程改掉就解决了 ...
随机推荐
- EF入门 IQueryable和IEnumberable的区别
IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代.也就是说:实现了此接口的object,就可以直接使用foreach遍历此object: IQueryable 接口 ...
- mongodb 、nosql、 redis、 memcached 是什么?
mongodb 是一个基于文档的数据库,所有数据是从磁盘上进行读写的.MongoDB善长的是对无模式JSON数据的查询.而Redis是一个基于内存的键值数据库,它由C语言实现的,与Nginx/ Nod ...
- 如何用boost::serialization去序列化派生模板类(续)
在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. ...
- Codeforces Round #192 (Div. 1) C. Graph Reconstruction 随机化
C. Graph Reconstruction Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/3 ...
- C# : 操作Word文件的API - (将C# source中的xml注释转换成word文档)
这篇博客将要讨论的是关于: 如何从C#的source以及注释, 生成一份Word格式的关于各个类,函数以及成员变量的说明文档. 他的大背景如下...... 最近的一个项目使用C#, 分N个模块, 在项 ...
- android访问webservices
/** * 手机号段归属地查询(模拟器.HTC 可以) * * @param phoneSec 手机号段 */ public void getRemoteInfo() { /*String pho ...
- android144 360 快捷方式
package com.example; import android.net.Uri; import android.os.Bundle; import android.app.Activity; ...
- mydumper原理3
Mydumper介绍 Mydumper是一个针对MySQL和Drizzle的高性能多线程备份和恢复工具.开发人员主要来自MySQL,Facebook,SkySQL公司.目前已经在一些线上使用了Mydu ...
- [置顶] mybatis的批量新增
开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入50条数据用了将近1s,完全满足不了系统的需求.效率必须加快,然后网 ...
- Android(java)学习笔记108:通过反射获取私有构造方法并且使用
反射获取私有构造方法并且使用: 1.获取字节码文件.class对象: Class c = Class.forName("cn.itcast_01.Person") ...