* 受信したXMLデータを解析する(SAX版) [#z8ff24cf]
#setlinebreak(on)

《受信した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