java dom、sax解析xml

本文详细介绍了如何使用SAX解析器解析XML报文,并提供了代码示例。主要内容包括XML报文结构解析、SAX解析器的实现及XML文档的解析流程。通过实例演示了如何获取XML文档中的特定数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML报文:

<?xml version="1.0" encoding="utf-8" ?>
<ROWDATA>
<ROW>
  <T_ID>1</T_ID>
  <T_KEY>binding_time</T_KEY>
  <T_VALUE></T_VALUE>
  <T_REMARK>保存im.cgs_bind_info的binding_time字段</T_REMARK>
</ROW>
<ROW>
  <T_ID>2</T_ID>
  <T_KEY>relate_time</T_KEY>
  <T_VALUE>2015-06-09 23:55:26</T_VALUE>
  <T_REMARK>保存im.cgs_relate_info的relate_time字段</T_REMARK>
</ROW>
<ROW>
  <T_ID>3</T_ID>
  <T_KEY>bind_oper_time</T_KEY>
  <T_VALUE></T_VALUE>
  <T_REMARK>保存im.cgs_user_bind_oper的oper_time字段</T_REMARK>
</ROW>
</ROWDATA>

sax解析XML:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

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

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

public class SaxParser extends DefaultHandler {
	private List<Map<String, Object>> list;
	
	/**
	 * 解析XML文档
	 * @param filePath 要解析的文件路径
	 * @throws IOException
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 */
	public SaxParser(String filePath) throws IOException, ParserConfigurationException, SAXException {
		SAXParser parser = null;
		try {
			// 构建SAXParser
			parser = SAXParserFactory.newInstance().newSAXParser();
			File file = new File(filePath);
			FileInputStream fis = new FileInputStream(file);
			SaxHandler saxHandler = new SaxHandler();
			// 调用parse()方法
			parser.parse(fis, saxHandler);
			list = saxHandler.getRowList();
			fis.close();
		} catch (ParserConfigurationException e) {
			throw e;
		} catch (SAXException e) {
			throw e;
		} catch (IOException e) {
			throw e;
		} finally {
			if (parser != null)
				parser.reset();
		}
	}
	/**
	 * 解析XML文档
	 * @param is 要解析的文件输入流
	 * @throws IOException
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 */
	public SaxParser(InputStream is) throws IOException, ParserConfigurationException, SAXException {
		SAXParser parser = null;
		try {
			// 构建SAXParser
			parser = SAXParserFactory.newInstance().newSAXParser();
			SaxHandler saxHandler = new SaxHandler();
			// 调用parse()方法
			parser.parse(is, saxHandler);
			list = saxHandler.getRowList();
			is.close();
		} catch (ParserConfigurationException e) {
			throw e;
		} catch (SAXException e) {
			throw e;
		} catch (IOException e) {
			throw e;
		} finally {
			if (parser != null)
				parser.reset();
		}
	}
	/**
	 * 获取解析后得到的List
	 */
	public List<Map<String, Object>> getRowList() {
		return list;
	}
}
class SaxHandler extends DefaultHandler{
	List<Map<String, Object>> list;
	Map<String, Object> map;
	private String qName; // 节点名称
	private StringBuilder sb = new StringBuilder();// 保存节点内容
	
	/**
	 * 获取解析后得到的List
	 */
	public List<Map<String, Object>> getRowList() {
		return list;
	}
	
	@Override
	public void startDocument() throws SAXException {
//		System.out.println("开始解析XML");
		list = new ArrayList<Map<String,Object>>();
	}

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//		System.out.println("读取标签:" + uri + " ---> " + localName + " ---> " + qName);
		/*
		 * 如果使用localName的话,有些环境下永远为空,qName就不会用这种情况
		 */
		this.qName = qName;
		if ("ROW".equals(this.qName)) {
			map = new LinkedHashMap<String, Object>();
		}
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		/*
		如果xml文档交长(一般4k会清理一下内存),有可能一个元素的值会被分成两次(多次)读入。
		如果只用characters方法去获得元素的值,很可能得到的不完整的数据。
		characters会在startElement和endElement之间调用多次,不能保证一次会返回整个文本块,所以必须等待endElement的时候才可以认为这个文本结点结束。
		*/
		if (this.qName != null && !"ROWDATA".equals(this.qName) && !"ROW".equals(this.qName)) {
			String data = new String(ch, start, length);
			sb.append(data);
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if (this.qName != null && !"ROWDATA".equals(this.qName) && !"ROW".equals(this.qName)) {
			// 等到解析完当前qName标签,再将qName和值放到map中
			map.put(this.qName, sb.toString());
			sb.setLength(0);
		}
		if ("ROW".equals(qName)) {
			list.add(map);
		}
		// 当前qName解析结束时置为空。
		this.qName = null;
	}
	
	@Override
	public void endDocument() throws SAXException {
//		System.out.println("结束解析XML");
	}
}

dom4j解析XML:

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jParser {
	private List<Map<String, Object>> list;
	
	/**
	 * 解析XML文档
	 * @param filePath 要解析的文件路径
	 * @throws DocumentException
	 */
	public Dom4jParser(String filePath) throws DocumentException {
		list = new ArrayList<Map<String,Object>>();
		SAXReader reader = new SAXReader();
		File file = new File(filePath);
		Document document = reader.read(file);
		list = parserXML(document);
	}
	/**
	 * 解析XML文档
	 * @param is 要解析的文件输入流
	 * @throws DocumentException
	 */
	public Dom4jParser(InputStream is) throws DocumentException {
		list = new ArrayList<Map<String,Object>>();
		SAXReader reader = new SAXReader();
		Document document = reader.read(is);
		list = parserXML(document);
	}

	public List<Map<String, Object>> getRowList() {
		return list;
	}
	
	/**
	 * 解析根节点,获取得到所有ROW节点的子节点的集合
	 */
	private List<Map<String, Object>> parserXML(Document document) throws DocumentException {
		Element rowdata = document.getRootElement(); // ROWDATA跟节点
		List<Element> rows = rowdata.elements("ROW");
		List<Map<String, Object>> list = parserRowElement(rows);
		return list;
	}
	/**
	 * 解析ROW节点下的子节点
	 */
	private List<Map<String, Object>> parserRowElement(List<Element> rows) {
		for (Element element : rows) {
			Map<String, Object> map = new LinkedHashMap<String, Object>();
			Iterator<Element> it = element.elementIterator();
			while (it.hasNext()) {
				Element next = it.next();
				map.put(next.getName(), next.getTextTrim());
			}
			list.add(map);
		}
		return list;
	}
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值