- 追加された行はこの色です。
- 削除された行はこの色です。
* 受信した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);
}
}