两种方式(Dom4J和SAX)解析XML

2 篇文章 0 订阅

package com.parse.sym;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

public class Test {

/**
* @param args
*
* XML采用两种方法:Dom4J和SAX
* Dom4J优缺点:解析的过程中是把整个XML文件作为一个对象,不管文件有多大,放进到内存中
* 采用的是xpath方式解析XML,即在XML中找到指定节点的路径path,可以直接拿到想要的节点
* 当文件很大时,这种方式不是很理想,所以一般处理小文件
* SAX优缺点: 解析的过程非常类似于流媒体,就是读一点,我就解析一点。所以适合处理大文件
*
*/
public static void main(String[] args) {
//dom4j进行解析
XMLparse parse=new XMLparse();
// try {
// parse.dom4jParse("D:\\testxml.xml");
// } catch (DocumentException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//sax进行解析
try {
parse.saxParse("D:\\testxml.xml");
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
package com.parse.sym;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;

public class XMLparse {
public void dom4jParse(String pathName) throws DocumentException {
File file = new File(pathName);
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(file);
Element root = doc.getRootElement();
Element fooElement;
for (Iterator<Element> i = root.elementIterator("disk"); i.hasNext();) {
fooElement = i.next();
System.out.println("name:" + fooElement.attributeValue("name"));
System.out
.println("capacity:" + fooElement.elementText("capacity"));
System.out.println("directories:"
+ fooElement.elementText("directories"));
System.out.println("files:" + fooElement.elementText("files"));
System.out.println(">>>>>>>>>>>>>>>>>>>>");
}
}
/**
* SAX工作原理:在Sax的解析过程中,读取到文档开头、结尾,元素的开头和结尾都会触发一些回调方法,你可以在这些回调方法中进行相应事件处理
* 这四个方法是:startDocument() 、 endDocument()、 startElement()、 endElement
* 此外,光读取到节点处是不够的,我们还需要characters()方法来仔细处理元素内包含的内容
* 将这些回调方法集合起来,便形成了一个类,这个类也就是我们需要的触发器 一般从Main方法中读取文档,却在触发器中处理文档,
* 这就是所谓的事件驱动解析方法
* 在触发器中,首先开始读取文档,然后开始逐个解析元素,每个元素中的内容会返回到characters()方法
* 接着结束元素读取,所有元素读取完后,结束文档解析
*/


public void saxParse(String pathName) throws ParserConfigurationException, SAXException, IOException{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
File file = new File(pathName);
SaxHandler dh = new SaxHandler();
parser.parse(file, dh);

}

}
package com.parse.sym;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxHandler extends DefaultHandler{
/* 此方法有三个参数
arg0是传回来的字符数组,其包含元素内容
arg1和arg2分别是数组的开始位置和结束位置 */
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
String content = new String(arg0, arg1, arg2);
System.out.println(content);
super.characters(arg0, arg1, arg2);
}

@Override
public void endDocument() throws SAXException {
System.out.println("\n…………结束解析文档…………");
super.endDocument();
}

/* arg0是名称空间
arg1是包含名称空间的标签,如果没有名称空间,则为空
arg2是不包含名称空间的标签 */
@Override
public void endElement(String arg0, String arg1, String arg2)
throws SAXException {
System.out.println("结束解析元素 " + arg2);
super.endElement(arg0, arg1, arg2);
}

@Override
public void startDocument() throws SAXException {
System.out.println("…………开始解析文档…………\n");
super.startDocument();
}

/*arg0是名称空间
arg1是包含名称空间的标签,如果没有名称空间,则为空
arg2是不包含名称空间的标签
arg3很明显是属性的集合 */
public void startElement(String arg0, String arg1, String arg2,
Attributes arg3) throws SAXException {
System.out.println("开始解析元素 " + arg2);
if (arg3 != null) {
for (int i = 0; i < arg3.getLength(); i++) {
// getQName()是获取属性名称,
System.out.print(arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\"");
}
}
System.out.print(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<HD>
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk>

<disk name="D">
<capacity>10G</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>





饿咕~~(╯﹏╰)b
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值