受信したXMLデータを解析する(SAX版)

《受信したXMLをパースしてMapに変換する》

 【パーサーの作成】

package example.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

public class MySaxParser extends DefaultHandler {

	private Map nowMapRef = null;
	
	private List<String> elements = new ArrayList<String>();

	private Map dataBean = new HashMap();
	
	public MySaxParser(Map dataBean) {
		this.dataBean = dataBean;
	}
	
	public Map getDataBean(){
		return dataBean;
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {

		Object nowObj = dataBean;
		for (int i = 0; i < elements.size(); i++) {
			String elementName = elements.get(i);
			Map nowMap = null;
			if (nowObj instanceof Map) {
				nowMap = (Map)nowObj;
			} else if (nowObj instanceof List){
				List nowList = (List)nowObj;
				nowMap = (Map)nowList.get(nowList.size()-1);
			}
			nowObj = nowMap.get(elementName);
		}

		Map nowMap = null;
		if (nowObj instanceof Map) {
			nowMap = (Map)nowObj;
		} else if (nowObj instanceof List){
			List nowList = (List)nowObj;
			nowMap = (Map)nowList.get(nowList.size()-1);
		}

		if (!nowMap.containsKey(qName)) {
			nowMap.put(qName, new HashMap());
		} else {
			Object nowBase = nowMap.get(qName);
			List nowList = null;
			if (nowBase instanceof List) {
				nowList = (List)nowBase;
			} else {
				nowList = new ArrayList();
				nowList.add((Map)nowBase);
			}
			nowList.add(new HashMap());
			nowMap.put(qName, nowList);
		}

		nowMapRef = nowMap;
		elements.add(qName);
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {

		String chars = new String(ch, start, length);
		if ((chars.length() > 0) && (!"\n".equals(chars))){
			String nowName = elements.get(elements.size()-1);
			nowMapRef.put(nowName, chars);
		}
	}

	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		elements.remove(elements.size()-1);
	}
}

 【XMLデータを受け取るサーブレット】

package example;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;

import example.util.MySaxParser;

public class Example1 extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response) {

		SAXParserFactory spfactory = SAXParserFactory.newInstance();
		SAXParser parser;
		String encoding = "UTF-8";

		try {
			request.setCharacterEncoding(encoding);
			Map dataMap = new HashMap();
			MySaxParser myParser = new MySaxParser(dataMap);
			parser = spfactory.newSAXParser();
			InputSource is = new InputSource(new InputStreamReader(request.getInputStream(), encoding));
			is.setEncoding(encoding);
			parser.parse(is, myParser);
//			parser.parse(request.getInputStream(), myParser);

			// 変換後のMapを出力
			System.out.println(dataMap);

			response.setCharacterEncoding(encoding);
			PrintWriter writer = response.getWriter();
			writer.print(dataBean.toString());

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 【XMLデータを送信するサーブレット】

public class TestRequest extends HttpServlet {
	

	@SuppressWarnings("rawtypes")
	public void doProcess(HttpServletRequest request, HttpServletResponse response) {

 		String encoding = "UTF-8";

		// 送信するXMLを記述したファイルを用意しておく
		String xmlFile = "c:/tmp/test.xml";
		BufferedReader xmlReader = new BufferedReader(new InputStreamReader(new FileInputStream(new java.io.File(xmlFile)), encoding));
		String xmlRec = null;
		StringBuffer xmlSb = new StringBuffer();
		while ((xmlRec = xmlReader.readLine())!=null) {
			xmlSb.append(xmlRec);
		}
		String xmlText = xmlSb.toString();

		URL url = null;
		try {
			url = new URL("http://localhost:8080/test/example1");
			HttpURLConnection con = (HttpURLConnection)url.openConnection();
			con.setDoInput(true);
			con.setDoOutput(true);
			con.setRequestMethod("POST");
			con.setRequestProperty("Content-Type", "text/xml; charset="+encoding);
			
			OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream(), encoding);
			osw.write(xmlText);
			osw.flush();
			osw.close();
			
			InputStream is = con.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(is, encoding));
			String s;
			String responseStr = "";
			while ((s = reader.readLine()) != null) {
				responseStr += s;
			}
			reader.close();
			is.close();
			
			response.setCharacterEncoding(encoding);
			response.setContentType("text/plain; charset=\""+encoding+"\"");
			PrintWriter writer = response.getWriter();
			writer.println("***** レスポンスSTART ******");
			writer.println(responseStr);
			writer.println("***** レスポンス END  ******");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) {

		doProcess(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) {
		
		doProcess(request, response);
	}
	
}

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-02 (月) 16:47:13 (4743d)