受信した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); } } |