最終更新日:190510 原本2009/03/30

Java - サーブレットからの DOM の利用


■ページ目次

Top

サーブレットでの整形式 XML 文書の取得

Top
サーブレットを使った例題
  1. テキストp.330のMyFirstServlet.java を"DomServlet81.java" と名前を替えて作成・実行してください。
    XML文書ファイル名は、クエリー情報docによって取得します。デフォルトは、"MyJavaBooks.xml" とします。
  2. "DomServlet81.java"

    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. import org.w3c.dom.*;
    5. import org.xml.sax.*;
    6. import org.apache.xerces.parsers.*;
    7. public class DomServlet81 extends HttpServlet {
    8. // doGet()メソッドをオーバーライドする
    9. public void doGet(HttpServletRequest request,
    10. HttpServletResponse response)
    11. throws ServletException, IOException {
    12. // out オブジェクトを取得する
    13. response.setContentType("text/html;charset=iso-2022-jp");
    14. PrintWriter out = response.getWriter();
    15. // XMLドキュメントの入力ソースを作成する
    16. String xmlDocumentName = null;
    17. if ((xmlDocumentName = request.getParameter("doc")) == null) {
    18. xmlDocumentName = "MyJavaBooks.xml";
    19. }
    20. BufferedReader br = new BufferedReader(new FileReader( getServletContext().getRealPath(xmlDocumentName)));
    21. InputSource is = new InputSource(br);
    22. // DOMParserのインスタンスを生成する
    23. DOMParser parser = new DOMParser();
    24. try {
    25. // DOMパーサーを使ってDOMツリーを生成する
    26. parser.parse(is);
    27. } catch (SAXException e) { throw new ServletException(e.toString()); }
    28. br.close();
    29. // DOMパーサーからドキュメントを取得する
    30. Document doc = parser.getDocument();
    31. // ドキュメントのすべてのタグのNodeListを取得する
    32. NodeList nlist = doc.getElementsByTagName("*"), childlist = null;
    33. String str = "";
    34. NamedNodeMap map = null;
    35. // ノードリストをたどる
    36. for (int i = 0; i < nlist.getLength(); i++) {
    37. str += "<hr/>☆" + nlist.item(i).getNodeName();
    38. str += "★" + nlist.item(i).getNodeValue();
    39. if (nlist.item(i).hasAttributes()) {
    40. map = nlist.item(i).getAttributes();
    41. // 属性情報を取り出す(アルファベット順)
    42. for (int j = 0; j < map.getLength(); j++) {
    43. str += "△" + map.item(j).getNodeName();
    44. str += "▲" + map.item(j).getNodeValue();
    45. }
    46. }
    47. if (nlist.item(i).hasChildNodes()) {
    48. childlist = nlist.item(i).getChildNodes();
    49. for (int j = 0; j < childlist.getLength(); j++) {
    50. str += "▽" + childlist.item(j).getNodeName();
    51. str += "▼" + childlist.item(j).getNodeValue();
    52. }
    53. }
    54. }
    55. // HTMLテキストを出力する
    56. out.println("<html>"
    57. + "<head><title>DOMを使ってXMLドキュメントの情報を取得する</title></head>"
    58. + "<body>"
    59. + "<h3>DOMを使ってXMLドキュメントの情報を取得する</h3>" + str
    60. + "</body></html>");
    61. }
    62. }

    "MyJavaBooks.xml"

    1. <?xml version="1.0" encoding="Shift_JIS" ?>
    2. <MyJavaBooks>
    3. <book>
    4. <name cd-rom="有り" sdk-version="1.3、1.4.0_01">Java GUIコンポーネント 完全制覇</name>
    5. <series>標準プログラマーズライブラリ</series>
    6. <publisher>技術評論社</publisher>
    7. <price>2880</price>
    8. </book>
    9. <book>
    10. <name cd-rom="なし" sdk-version="1.3">はじめてのJava 完全入門</name>
    11. <series>標準プログラマーズライブラリ</series>
    12. <publisher>技術評論社</publisher>
    13. <price>2580</price>
    14. </book>
    15. <book>
    16. <name cd-rom="有り" sdk-version="1.4.0_01、1.4.1">ひとりでできるJava 実践入門</name>
    17. <series>標準プログラマーズライブラリ</series>
    18. <publisher>技術評論社</publisher>
    19. <price>2980</price>
    20. </book>
    21. </MyJavaBooks>

    □ 実行結果

    http://localhost:8080/jmwapp/servlet/DomServlet81
    
    
Top
実習
  1. 上記例題"DomServlet81.java" を、実行結果を参考に改造して、"DomServlet82.java" を作成・実行してください。
    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. import org.w3c.dom.*;
    5. import org.xml.sax.*;
    6. import org.apache.xerces.parsers.*;
    7. public class DomServlet82 extends HttpServlet {
    8. // doGet()メソッドをオーバーライドする
    9. public void doGet(HttpServletRequest request,
    10. HttpServletResponse response)
    11. throws ServletException, IOException {
    12. // out オブジェクトを取得する
    13. response.setContentType("text/html;charset=iso-2022-jp");
    14. PrintWriter out = response.getWriter();
    15. // XMLドキュメントの入力ソースを作成する
    16. String xmlDocumentName = null;
    17. if ((xmlDocumentName = request.getParameter("doc")) == null) {
    18. xmlDocumentName = "MyJavaBooks.xml";
    19. }
    20. BufferedReader br = new BufferedReader(new FileReader( getServletContext().getRealPath(xmlDocumentName)));
    21. InputSource is = new InputSource(br);
    22. // DOMParserのインスタンスを生成する
    23. DOMParser parser = new DOMParser();
    24. try {
    25. // DOMパーサーを使ってDOMツリーを生成する
    26. parser.parse(is);
    27. } catch (SAXException e) { throw new ServletException(e.toString()); }
    28. br.close();
    29. // DOMパーサーからドキュメントを取得する
    30. Document doc = parser.getDocument();
    31. // ドキュメントのすべてのタグのNodeListを取得する
    32. NodeList nlist = doc.getElementsByTagName("*"), childlist = null;
    33. String str = "";
    34. NamedNodeMap map = null;
    35. str += "<table border='1'>";
    36. str += "<tr>";
    37. str += "<th>要素</th>";
    38. str += "<th>属性</th>";
    39. str += "<th>内容</th>";
    40. str += "</tr>";
    41. // ノードリストをたどる
    42. for (int i = 0; i < nlist.getLength(); i++) {
    43. str += "<tr>";
    44. // ここにコードを記述してください。
    45. str += "<td>";
    46. if (nlist.item(i).hasAttributes()) {
    47. map = nlist.item(i).getAttributes();
    48. // 属性情報を取り出す(アルファベット順)
    49. for (int j = 0; j < map.getLength(); j++) {
    50. // ここにコードを記述してください。
    51. str += "<br/>";
    52. }
    53. }
    54. str += "</td>";
    55. if (nlist.item(i).hasChildNodes()) {
    56. childlist = nlist.item(i).getChildNodes();
    57. for (int j = 0; j < childlist.getLength(); j++) {
    58. if (childlist.item(j).getNodeValue() != null) {
    59. // ここにコードを記述してください。
    60. }
    61. }
    62. }
    63. str += "</tr>";
    64. }
    65. str += "</table>";
    66. // HTMLテキストを出力する
    67. out.println("<html>"
    68. + "<head><title>DOMを使ってXMLドキュメントの情報を取得する</title></head>"
    69. + "<body>"
    70. + "<h3>DOMを使ってXMLドキュメントの情報を取得する</h3>" + str
    71. + "</body></html>");
    72. }
    73. }

    □ 実行結果

    http://localhost:8080/jmwapp/servlet/DomServlet82
    
    
  2. (オプション)
    上記"DomServlet82.java" で、image 要素に画像ファイルのuriを指定されたら、そのファイル名でなく、画像を表示するように改造して、"DomServlet83.java" を作成・実行してください。
    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. import org.w3c.dom.*;
    5. import org.xml.sax.*;
    6. import org.apache.xerces.parsers.*;
    7. public class DomServlet82 extends HttpServlet {
    8. // doGet()メソッドをオーバーライドする
    9. public void doGet(HttpServletRequest request,
    10. HttpServletResponse response)
    11. throws ServletException, IOException {
    12. // out オブジェクトを取得する
    13. response.setContentType("text/html;charset=iso-2022-jp");
    14. PrintWriter out = response.getWriter();
    15. // XMLドキュメントの入力ソースを作成する
    16. String xmlDocumentName = null;
    17. if ((xmlDocumentName = request.getParameter("doc")) == null) {
    18. xmlDocumentName = "MyJavaBooks.xml";
    19. }
    20. BufferedReader br = new BufferedReader(new FileReader( getServletContext().getRealPath(xmlDocumentName)));
    21. InputSource is = new InputSource(br);
    22. // DOMParserのインスタンスを生成する
    23. DOMParser parser = new DOMParser();
    24. try {
    25. // DOMパーサーを使ってDOMツリーを生成する
    26. parser.parse(is);
    27. } catch (SAXException e) { throw new ServletException(e.toString()); }
    28. br.close();
    29. // DOMパーサーからドキュメントを取得する
    30. Document doc = parser.getDocument();
    31. // ドキュメントのすべてのタグのNodeListを取得する
    32. NodeList nlist = doc.getElementsByTagName("*"), childlist = null;
    33. String str = "";
    34. NamedNodeMap map = null;
    35. str += "<table border='1'>";
    36. str += "<tr>";
    37. str += "<th>要素</th>";
    38. str += "<th>属性</th>";
    39. str += "<th>内容</th>";
    40. str += "</tr>";
    41. // ノードリストをたどる
    42. for (int i = 0; i < nlist.getLength(); i++) {
    43. str += "<tr>";
    44. // ここにコードを記述してください。
    45. str += "<td>";
    46. if (nlist.item(i).hasAttributes()) {
    47. map = nlist.item(i).getAttributes();
    48. // 属性情報を取り出す(アルファベット順)
    49. for (int j = 0; j < map.getLength(); j++) {
    50. // ここにコードを記述してください。
    51. str += "<br/>";
    52. }
    53. }
    54. str += "</td>";
    55. if (nlist.item(i).hasChildNodes()) {
    56. childlist = nlist.item(i).getChildNodes();
    57. for (int j = 0; j < childlist.getLength(); j++) {
    58. if (childlist.item(j).getNodeValue() != null) {
    59. // ここにコードを記述してください。
    60. }
    61. }
    62. }
    63. str += "</tr>";
    64. }
    65. str += "</table>";
    66. // HTMLテキストを出力する
    67. out.println("<html>"
    68. + "<head><title>DOMを使ってXMLドキュメントの情報を取得する</title></head>"
    69. + "<body>"
    70. + "<h3>DOMを使ってXMLドキュメントの情報を取得する</h3>" + str
    71. + "</body></html>");
    72. }
    73. }

    □ 実行結果

    http://localhost:8080/jmwapp/servlet/DomServlet83
    
    
Top

サーブレットでの XML 文書の作成

Top
■例題
  1. テキストp.355のMyFirstServlet.java を"CreateXmlDocument81.java" と名前を替えて作成・実行してください。
    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. import org.w3c.dom.*;
    5. import org.apache.xerces.dom.*;
    6. import org.apache.xml.serialize.*;
    7. public class CreateXmlDocument81 extends HttpServlet {
    8. // doGet()メソッドをオーバーライドする
    9. public void doGet(HttpServletRequest request,
    10. HttpServletResponse response)
    11. throws ServletException, IOException {
    12. // out オブジェクトを取得する
    13. response.setContentType("text/html;charset=iso-2022-jp");
    14. PrintWriter out = response.getWriter();
    15. // 新規ドキュメントのツリーを作成する
    16. DOMImplementationImpl domimpl = new DOMImplementationImpl();
    17. Document wdoc = null;
    18. try {
    19. wdoc = domimpl.createDocument(null, "animals", null);
    20. } catch (DOMException e) { throw new ServletException(e.toString()); }
    21. Element root = wdoc.getDocumentElement();
    22. Element element = wdoc.createElement("name");
    23. Text text = wdoc.createTextNode("ウマ");
    24. element.appendChild(text);
    25. root.appendChild(element);
    26. element = wdoc.createElement("name");
    27. text = wdoc.createTextNode("ヒツジ");
    28. element.appendChild(text);
    29. root.appendChild(element);
    30. element = wdoc.createElement("name");
    31. text = wdoc.createTextNode("サル");
    32. element.appendChild(text);
    33. root.appendChild(element);
    34. // XMLドキュメントの出力ソースを作成する
    35. BufferedWriter bwriter = new BufferedWriter(new FileWriter( getServletContext().getRealPath("new.xml")));
    36. // 出力書式を制御するOutputFormatオブジェクトを作成する
    37. OutputFormat oform = new OutputFormat(wdoc, "Shift_JIS", true);
    38. // XMLSerializerシリアライザを作成する
    39. XMLSerializer serial = new XMLSerializer(bwriter, oform);
    40. // 作成したツリーを書き出す
    41. serial.serialize(wdoc);
    42. bwriter.close();
    43. // HTMLテキストを出力する
    44. out.println("<html>"
    45. + "<head><title>XMLSerializerを使ってnew.xmlドキュメントを生成する</title></head>"
    46. + "<body>"
    47. + "<h3>XMLSerializerを使ってnew.xmlドキュメントを生成する</h3>"
    48. + "</body></html>");
    49. }
    50. }

    □ 実行結果

    http://localhost:8080/jmwapp/servlet/CreateXmlDocument81
    
    
Top
■実習
  1. 上記"CreateXmlDocument81.java" に対して、つぎのことを追加して、"CreateXmlDocument81.java" を作成してください。

□ 実行結果

http://localhost:8080/jmwapp/servlet/DomServlet82

Top