XML文件解析

1、dom4j

Dom4j是一个易用的、开源的库,用于XML、XPath和XSLT。

它应用于Java平台,采用了Java集合框架并完全支持DOM、SAX和JAXP。

在Java开发社区里,DOM4J的使用最为广泛。

JDOM的操作非常简单,但是在处理大XML文件时性能表现不佳,解析10M文档时就会内存溢出。

而DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和易于使用的特点,同时它也是一个开放源代码的软件,DOM4J使用大量的接口,这也是它被认为比JDOM灵活的原因

接口说明
Attribute定义了XML的属性
CDATA定义了XML CDATA 区域
CharacterData标识基于字符的节点。如CDATA,Comment, Text.
Comment定义了XML注释的行为
Document定义了XML文档
DocumentType定义XML DOCTYPE声明
Element定义XML 元素
ElementHandler定义了 Element 对象的处理器
Node为所有的dom4j中XML节点定义了多态行为
ProcessingInstruction定义 XML 处理指令
Text定义XML 文本节点
XPath在分析一个字符串后会提供一个XPath 表达式

Dom适用于
在结构上修改XML文档时。例如,以特定的顺序对元素进行排序或将某些元素从树中的一个位置移至另一个位置。
在内存中与其他应用程序共享文档时。

代码示例:
通过传入的对象集合创建对应的xml文件

	/**
	 * 	通过传入的对象集合创建xml文件
	 * @param objectList	对象列表
	 * @throws Exception
	 */
	private static void createX(List<?> objectList) throws Exception{
		// TODO Auto-generated method stub
		
		// 1.创建dom对象
		Document document = DocumentHelper.createDocument();
		// 2.创建根节点
		Element rootElement = DocumentHelper.createElement("ListObject");
		document.setRootElement(rootElement);
		int size  = objectList.size();
		for (int i = 0;i<size;i++) {
			//创建子节点
			List<Element> elementList = createElements(objectList.get(i),rootElement);
			//设置子节点值
			setElementValue(objectList.get(i),elementList);
		}
		
		OutputFormat format = OutputFormat.createCompactFormat();
		format.setEncoding("UTF-8");
		OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("F:\\包\\newbookStore.xml"), "UTF-8");
		XMLWriter xmlWrite = new XMLWriter(writer,format);
		xmlWrite.write(document);
		xmlWrite.close();

	}

	/**
	 *	 设置值
	 * @param o				对象
	 * @param elementList	节点列表
	 * @throws Exception
	 */
	private static void setElementValue(Object o, List<Element> elementList) throws Exception{
		Field[] fields = o.getClass().getDeclaredFields();
		int elength = elementList.size();
		int flength = fields.length;
		for (int i = 0; i < elength; i++) {
			for (int j = 0; j < flength; j++) {
				if(elementList.get(i).getQualifiedName().equals(fields[j].getName())) {
					
					Field field = o.getClass().getDeclaredField(fields[j].getName());
					field.setAccessible(true);
					elementList.get(i).addText((String) field.get(o));
					field.setAccessible(false);
					
				}
			}
		}
	}

	/**
	 * 创建节点
	 * @param rootElement	根节点
	 * @return 	返回节点列表
	 */
	private static List<Element> createElements(Object o,Element rootElement) {
		Field[] fields = o.getClass().getDeclaredFields();
		int length = fields.length;
		List<Element> elementList = new ArrayList<Element>();
		Element celement = rootElement.addElement(o.getClass().getSimpleName());
		for (int i = 0; i < length; i++) {
			Element element = celement.addElement(fields[i].getName());
			elementList.add(element);
		}
		return elementList;
		
	}

2、SAX

SAX是XML的简单应用程序编程接口。
SAX提供一种用于解析XML文档的事件驱动模型,在识别不同的XML语法结构时,SAX解析器使用回调机制来通知客户端应用程序,而不是将整个文档都存储在内存中。即使是处理大型文档也不会占用大量内存

优点:

  • 在解析大型文档时,不必将整个文件加载到内存中,因此占用的内存比DOM少。
  • 在只需一个信息子集时,SAX忽略不需要的数据,而DOM无法做到这一点。

缺点:

  • 必须按到达顺序处理数据,不能对文档进行随机访问。
  • SAX是只读的,它是设计用来读取XML文档而不是写入它们。
  • 文档只能遍历一次。

代码示例:

private static void read() throws Exception{
		// TODO Auto-generated method stub
		//SAX文档解析工厂
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		//得到SAX解析器
		SAXParser saxParser = saxParserFactory.newSAXParser();
		//处理xml文件  真正的处理逻辑在XMLHandler
		saxParser.parse("F://xml//bookStore.xml", new XMLHandler());
	}

XMLHandler类

public class XMLHandler extends DefaultHandler{
	/**
	 * 属性列表
	 */
	private Attributes attributes;
	/**
	 * 值
	 */
	private String values;
	/**
	 * 开始处理xml
	 */
	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始处理");
	}
	/**
	 * 开始处理节点
	 */
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		this.attributes = attributes;
	}
	/**
	 * 处理节点,得到节点的值
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		this.values = new String(ch, start, length);
	}
	/**
	 * 节点处理完成
	 */
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		System.out.print("当前节点:"+qName);
		int attLength = this.attributes.getLength();
		if(null != this.attributes && attLength != 0) {
			System.out.println(qName + "的属性:");
			System.out.println();
			
			for (int i = 0; i < attLength; i++) {
				System.out.print(attributes.getQName(i) + ":" + attributes.getValue(i));
			}
			this.attributes = null;
		}
		if(null != this.values ) {
			System.out.print( "  值:" + this.values);
			this.values = null;
		}else {
			System.out.println();
		}
		System.out.println();
	}
	/**
	 * xml处理完成
	 */
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		System.out.println("处理完成");
	}
}

更多代码示例:https://download.csdn.net/download/qq_39997210/11458571

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值