- ベストアンサー
DOMでXMLからデータを抽出するとNULLになる(JSP)
- JSPを勉強中なのですが、XMLからデータを抽出する際にNULLになってしまいます。
- エラーメッセージによると、NullPointerExceptionが発生しているようです。
- JDK1.6、Tomcat6を使用している環境で、new Fileの部分が原因と思われます。
- みんなの回答 (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>"); } ---------------------------------------------------------------------- のような処理を入れてあげると良いと思います。 # エラー処理は省略してあるので、実際に実装する時は、エラー処理もして下さい。
その他の回答 (1)
- Yanch
- ベストアンサー率50% (114/225)
>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となっているようです。 この手の処理は、トレースと変数のダンプをしっかりやれば簡単に原因を突き止められる はずですので、ロギング処理を追加するか、デバッガを使用すると良いでしょう。 ところで、本当は、どのような動作を期待されていましたか?
お礼
早速の回答ありがとうございます。 どんな状態になっているか調べようと自分なりに少しいじくってみたのですが、 コード: 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があるものじゃないんでしょうか?? 動作は説明しづらいので画像をキャプチャしたので載せておきます。 おそらくこの通りに表示されるはずなのですが…
補足
すみません、画像無理だったのでテキストで、 住所録一覧 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 こんな感じで表示される処理です。
お礼
コードまで書いていただき申し訳ないです。 全くその通りの処理で問題なく表示されました。 (name以外のNodeも同様の処理を追加しました。) Nodeの構造が自分が想像していたものと違っていたんですね。 これで次のステップへ進めそうです。 非常に助かりました。ありがとうございました。。