XML解析工具化

4 篇文章 0 订阅

面向对象程序设计思想的重点是“工具化”编程思想,之前简单实现XML解析的代码有许多重复的部分,因此可以考虑将其工具化,为以后XML解析提供便利。

XML解析过程如下

  • 得到DocumentBuilder 对象
  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	DocumentBuilder db = dbf.newDocumentBuilder();
	InputStream is = Class.class.getResourceAsStream(xmlPath);
	Document document = db.parse(is);

DocumentBuilder 的对象对于不同的xml文件解析时,只需要一份即可,所以可以将其通过静态本地块设置为static成员(在类加载后未产生xml解析类对象前,就已经产生了一个DocumentBuilder 的对象,由于静态本地块只被执行一次,所以该对象仅一份)

  • parse方法“打开”要处理的XML文件,并得到Document类对象
    这一步需要用户提供XML的路径,将其生成一个方法如下:
public static Document loadXML(String xmlPath) throws Exception {
		InputStream is = XMLParser.class.getResourceAsStream(xmlPath);
		return loadXML(is);
	}
  • 根据需要解析各元素

    public abstract void dealElement(Element element,int index);
    // 这个方法的实现应该由使用该工具的用户完成
    // 根据需要解析的xml文件来确定如何处理某些元素

    XML解析工具化所有代码如下:

package com.mec.util;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public abstract class XMLParser {
	private static DocumentBuilder db;
	static {
		try {
			db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
	}

	public XMLParser() {
		
	}

	public static Document loadXml(InputStream is) throws SAXException, IOException {
		return db.parse(is);
	}
	
	public static Document loadXml(String xmlpath) throws SAXException, IOException {
		InputStream is = XMLParser.class.getResourceAsStream(xmlpath);
		return loadXml(is);
	}
	
	public abstract void dealElement(Element element,int index);
	
	public void parse(Document document,String tagName) {
		NodeList nodeList = document.getElementsByTagName(tagName);
		for(int index = 0;index < nodeList.getLength();index++) {
			Element element = (Element) nodeList.item(index);
			dealElement(element, index);
		}
	}
	
	public void parse(Element element,String tagName) {
		NodeList nodeList = element.getElementsByTagName(tagName);
		for(int index = 0;index < nodeList.getLength();index++) {
			Element ele = (Element) nodeList.item(index);
			dealElement(ele, index);
		}
	}
	
}

工具的使用

<?xml version="1.0" encoding="UTF-8"?>     <!-- 文档声明 -->
<players>                                  <!-- 根标签 -->
	<player name = "sehun" age = "19">
	<!-- 子标签 player ;属性 name、age--> 
		<hobbies>
	<!-- 子标签 hobbies -->
			<hobby>篮球</hobby>
	    <!-- 标签  文本内容 -->
	    	<hobby>跑步</hobby>
		    <hobby>游泳</hobby>
		    <hobby>唱歌</hobby>
	    </hobbies>
	</player>
	<player name = "vivi" age = "20">
		<hobbies>
		    <hobby>游泳</hobby>
		    <hobby>跑步</hobby>
	    </hobbies>
	</player>
	<player name = "demo" age = "18">
		<hobbies>
		    <hobby>篮球</hobby>
		    <hobby>跑步</hobby>
		    <hobby>旅行</hobby>
	    </hobbies>
	</player>
</players>
package com.mec.util.parser;

import org.w3c.dom.Element;

public class Test {
	public static void main(String[] args) {
		try {
			new XMLParser() {
				
				@Override
				public void dealElement(Element element, int index) {
					String playerName = element.getAttribute("name");
					String age = element.getAttribute("age");
					System.out.println("姓名:" + playerName + "  年龄 :" + age);
					System.out.println("  爱好:");
					new XMLParser() {
						
						@Override
						public void dealElement(Element element, int index) {
								String hobbyName = element.getTextContent();     //取得hobby标签的文本内容
								System.out.print( "  "+ hobbyName);		
						}
					}.parse(element, "hobby");
					System.out.println();
				}
			}.parse(XMLParser.loadXML("/test.xml"), "player");
		} catch (Exception e) {
			e.printStackTrace();
		};
		
	}
}

运行结果

姓名:sehun  年龄 :19
  爱好:
  篮球  跑步  游泳  唱歌
姓名:vivi  年龄 :20
  爱好:
  游泳  跑步
姓名:demo  年龄 :18
  爱好:
  篮球  跑步  旅行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值