• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DOMでXMLからデータを抽出するとNULLになる(JSP))

DOMでXMLからデータを抽出するとNULLになる(JSP)

このQ&Aのポイント
  • JSPを勉強中なのですが、XMLからデータを抽出する際にNULLになってしまいます。
  • エラーメッセージによると、NullPointerExceptionが発生しているようです。
  • JDK1.6、Tomcat6を使用している環境で、new Fileの部分が原因と思われます。

質問者が選んだベストアンサー

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

JAVA のAPI リファレンス http://java.sun.com/javase/ja/6/docs/ja/api/org/w3c/dom/Node.html にNodeの説明の説明がありますから、参考にして下さい。 Nodeがmenberの所まで来た時に、 ---------------------------------------------------------------------- if ("member".equals(objNod.getNodeName())) {   // ●member ノードへ対する処理   String id = "";   String name = "";      if (objNod.hasAttributes()) {     NamedNodeMap clnNnm = objNod.getAttributes();     Attr atrNam = (Attr)clnNnm.getNamedItem("id");     id = atrNam.getValue();   }      if (objNod.hasChildNodes()) {     NodeList clnNod2=objNod.getChildNodes();     for (int j = 0; j < clnNod2.getLength(); j++) {       Node objNod2 = clnNod2.item(j);       if ("name".equals(objNod2.getNodeName())) {         name = objNod2.getTextContent();       }     }   }      out.println("<td>" + id + "</td>");   out.println("<td>" + name + "</td>"); } ---------------------------------------------------------------------- のような処理を入れてあげると良いと思います。 # エラー処理は省略してあるので、実際に実装する時は、エラー処理もして下さい。

mintia444
質問者

お礼

コードまで書いていただき申し訳ないです。 全くその通りの処理で問題なく表示されました。 (name以外のNodeも同様の処理を追加しました。) Nodeの構造が自分が想像していたものと違っていたんですね。 これで次のステップへ進めそうです。 非常に助かりました。ありがとうございました。。

その他の回答 (1)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

>Node objNod=clnNod.item(i); >NamedNodeMap clnNnm=objNod.getAttributes(); >Attr atrNam=(Attr)clnNnm.item(0); >out.println("<td>" + atrNam.getValue() + "</td>"); >NodeList clnNod2=objNod.getChildNodes(); 例外が出ている原因は、アトリビュートの無いノードに対して、 objNod.getAttributes();を呼び出しているために、ここでnullが戻ってきますので、 clnNnmがnullである時に、clnNnm.item(0);などとしている ためNullPonterExceptionとなっているようです。 この手の処理は、トレースと変数のダンプをしっかりやれば簡単に原因を突き止められる はずですので、ロギング処理を追加するか、デバッガを使用すると良いでしょう。 ところで、本当は、どのような動作を期待されていましたか?

mintia444
質問者

お礼

早速の回答ありがとうございます。 どんな状態になっているか調べようと自分なりに少しいじくってみたのですが、 コード: Element objRoot=objDoc.getDocumentElement(); String TT = objRoot.getNodeName(); out.println(TT ); 結果→addbook コード: NodeList clnNod=objRoot.getChildNodes(); Node objNod=clnNod.item(0); String TT2 = objNod.getNodeName(); out.println(TT2 ); 結果→#text コード: Node objNod2=clnNod.item(1); String TT3 = objNod2.getNodeName(); out.println(TT3 ); 結果→member となってclnNod.item()の値を1~12まで変化させてみたところ、 1:#text 2:member 3:#text 4:member 5:#text 6:member 7:#text 8:member 9:#text 10:member 11:member 12:#text と表示されました。 #textというものが何なのか分かりません… memberの配下にname、gender、tel、addressがあるものじゃないんでしょうか?? 動作は説明しづらいので画像をキャプチャしたので載せておきます。 おそらくこの通りに表示されるはずなのですが…

mintia444
質問者

補足

すみません、画像無理だったのでテキストで、 住所録一覧 No. 名前      性別   TEL        住所 1    高橋秀和  男  04x-231x-123x  小金井市△△町123-3249 2   輪笠貴子    女  00x-1231-xxxx  横浜市○○区△△町34165-1 3   佐々木健司   男  04x-231x-xxxx  川崎市○○町1-3213 4   鳥内都      女  09x-21xx-xx97  横浜市◇◇区5-16 5   金崎瑞穂    女  02x-654x-324x  相模原市△△区1-9-21 10  川端真一    男  0xx-999-8888   相模原市★★町12313-1 こんな感じで表示される処理です。

関連するQ&A