javaでXMLファイルを操作する方法

このQ&Aのポイント
  • javaにてXMLファイルにデータベースの接続情報を保存する処理を行っています。XMLファイルの読み書きは正常に動作するのですが、XMLファイルを更新した後にデータベースに接続すると正常に処理されてしまいます。なぜデータベースに接続して行う処理が正常に流れるのか疑問です。
  • ただし、システムの実行を終了して再度実行すると、更新後のXMLファイルを読み込んでいるため、エラーが発生します。
  • この状況を解決するためには、XMLファイルを更新した後にシステムを再起動する必要があります。
回答を見る
  • ベストアンサー

java XMLファイル 操作

現在javaにてXMLファイルにデータベースの接続情報を保存する処理を 作成しています。XMLファイルの読み書きは問題なく動作するのですが、テストの為にXMLファイルを更新(データベースの接続情報は誤りの状態)にしました。その後データベースに接続して行う処理を行う際にはエラーとなる事を期待しているのですが、正常に処理されてしまいます。XMLファイルを更新した時点でテキストエディタ等で確認すると確かに更新されています。 なぜデータベースに接続して行う処理が正常に流れるのか疑問です。 ただし、いったんシステムの実行を終了して、再度実行すると、期待通りエラーとなります。 何か分かる方がいらっしゃればと思い質問いたしました。 <XML読込> public Object readXML(){ Object objBean = null; try{ // XMLからオブジェクトへの変換オブジェクトを生成する。 XMLDecoder xmlDecoder = new XMLDecoder( new BufferedInputStream( new FileInputStream(this._strFile))); // 指定したXMLファイルからオブジェクトにデータを読み込む objBean = xmlDecoder.readObject(); // 変換オブジェクトを閉じる xmlDecoder.close(); }catch(FileNotFoundException e){ // 指定されたパス名で示されるファイルが開けなかった場合の例外 bs.Setlog("readXML","FileNotFoundException",e.getMessage()); } <XML書込> public Boolean writeXML(Object objBean){ try{ // オブジェクトからXMLへの変換オブジェクトを生成する XMLEncoder xmlEncoder = new XMLEncoder( new BufferedOutputStream( new FileOutputStream(this._strFile))); // 指定したXMLファイルにオブジェクトデータを書き込む xmlEncoder.writeObject(objBean); // 変換オブジェクトを閉じる xmlEncoder.close(); // XMLファイル書込成功 return true; }catch(FileNotFoundException e) { // 指定されたパス名で示されるファイルが開けなかった場合の例外 bs.Setlog("writeXML","FileNotFoundException",e.getMessage()); return false; // 書込失敗 } }

  • Java
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • e00083
  • ベストアンサー率31% (25/80)
回答No.3

>いったんシステムの実行を終了して、再度実行すると、期待通りエラーとなります。 close()メソッドを実行しないと、ファイルを更新しないですよ。 FileInputStreamをクラス名を付けてcloseメソッドを実行してみたらどうですか。

その他の回答 (2)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 読込んだ接続情報をstaticで持ったりしてませんか? 一回読込んだ後はそこから取得するようなロジックになっていると XMLが更新されていてもダメだったりします。 (一度停止後に起動しなおすと期待通りになるってのもその辺が絡んでいる気がします) あとはコネクションつかみっぱなしとかでしょうか。

回答No.1

提示されたソースコードはあくまでxmlファイルの読み書きですよね? データベースの接続情報をどのように保持しているのでしょうか? という点が明らかになるソースコードや情報が開示されないと何が原因なのか判断できないと思います。

関連するQ&A

  • 例外を明示的にthrowするとき

    例外をthrowしたいとき、以下の場合、IllegalArgumentException、FileNotFoundException、どちらを使用していいのかわかりません。 public static void main(String[] args){ try{ AAA(new File(args[0])); }catch(FileNotFoundException e){ System.out.println(e.getMessage); } e)catch(IllegalArgumentException e){ System.out.println(e.getMessgae()); } } public static void AAA(File file){ if(isFile()){ //処理 }else{ throw new IllegalArgumentException("引数が不正です");    //それともthrow new FileNotFoundException("ファイルが存在しません"); } }

  • Return で文字列が返せない、、

    このような関数を作って、mainの関数に渡したいのですが、文法がダメだとコンパイラに怒られます。 private String test(){ try{ FileOutputStream fos=openFileOutput("sample.txt", MODE_PRIVATE); String text="サンプルテキストです"; fos.write(text.getBytes()); fos.close(); }catch(FileNotFoundException e){ }catch(IOException e){ } try{ FileInputStream fis=openFileInput("sample.txt"); byte buffer[]=new byte[100]; fis.read(buffer); String str = new String(buffer).trim(); fis.close(); return str; }catch(FileNotFoundException e){ }catch(IOException e){ } }なぜ返せないのでしょうか。

    • ベストアンサー
    • Java
  • Java ファイルオブジェクトでなく文字列オブジェクト?

    JavaでXMLをパースするプログラムを初めて試しています。 parseメソッドの第一引数がファイルオブジェクトなのですが、これをメモリ(文字列)オブジェクトを与えて同じ動作させるものはあるのでしょうか? // SAXパーサーファクトリを生成 SAXParserFactory spfactory = SAXParserFactory.newInstance(); // SAXパーサーを生成 SAXParser parser = spfactory.newSAXParser(); // XMLファイルを指定されたデフォルトハンドラーで処理します parser.parse(new File("helloworld.xml"), new InsXMLParser()); ※このように String str = "<xml? ......"; parser.XXXXXX(str, new InsXMLParser

    • ベストアンサー
    • XML
  • JavaによるXMLの読み込みについて

    現在、JavaでXMLを読みたく色々なサイト様を参考にさせて頂き プログラムを作成しております。 その結果、下記のようなプログラムで要素名を取得することは出来たのですが、 「属性名」と「属性の値」を読み込み表示することが中々上手くいきません。 どこに何を追加したらよいでしょうか。宜しければ教えて下さい。 -- sample.java -- sample.xml -------------------------------------- import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; public class sample { public static void main(String[] argv) { sample a = new sample(); a.runner(); } final static String file = "sample.xml"; public void runner() { DocumentBuilderFactory factory; DocumentBuilder builder; Node root; try { factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); factory.setIgnoringElementContentWhitespace(true); factory.setIgnoringComments(true); factory.setValidating(true); root = builder.parse(file); showNodes(root, " "); } catch (ParserConfigurationException e0) { System.out.println(e0.getMessage()); } catch (SAXException e1){ System.out.println(e1.getMessage()); } catch (IOException e2) { System.out.println(e2.getMessage()); } } public void showNodes(Node node, String space) { NodeList nodes = node.getChildNodes(); for (int i=0; i<nodes.getLength(); i++) { Node node2 = nodes.item(i); if(!node2.getNodeName().equals("#text")){ System.out.println(space + "<" + node2.getNodeName() + ">"); showNodes(node2, space + " "); } } } }

    • ベストアンサー
    • Java
  • JAVAの問題

    次のような練習問題なのですが… 「ファイル入出力操作の最中に生成される可能性のある例外の階層を、次に示します。 Exception   +--IOException      +--FileNotFoundException  指定した名前のファイルを開き、そのデータを読み取るxというメソッドがあるとします。 このx()メソッドにtry-catchステートメントが含まれていない場合に当てはまる説明はどれですか? 正しいものをすべて選んでください。 A.X()メソッドはIOExceptionまたはExceptionを生成するものとして宣言しなければならない。 b.X()メソッドはFileNotFoundExceptionを生成するものとして宣言しなければならない。 c.X()を呼び出すすべてのメソッドでtry-catchを使い、FileNotFoundExceptionをキャッチしなければならない D.特に注意すべきことは無い。」 正解はAのみになっています。 かなり疑問です。特にその解説が・・・ まずDが誤りなのはわかります。 Aもわかります。 しかしここからです(^_^;) bが不正解の理由が 「IOExceptionを宣言するだけで十分だから」 cが不正解の理由が 「try-catchを使う以外にも方法はあるから」 というものです。 どうも腑に落ちません。 問題が 「もっとも正しいものひとつを選べ」 というものならわかるのですが 「正しいものをすべて選んでください。」 という問題であるのだから、 bとcも正解になるような気がするのですが・・・ bとcが不正解である理由を教えてください。

    • ベストアンサー
    • Java
  • Try-catch文(FileInputStream)

    下記コードでエラーが出現して困っています。 fis.close();の部分でコンパイルエラー( 変数 fis は初期化されていない可能性があります。)の結果が返ってきます。 必ず通過するfinallyブロックにclose()処理を記述して、この処理もエラーが発生する可能性があるので、try-catchする必要があると教師が言っていました。 エラーが出現する原因はなぜでしょうか? 回答のほどよろしくお願い致します。 FileInputStream fis; try{ fis = new FileInputStream(fi.getAbsolutePath()); while( (b[i++] = fis.read()) != -1); }catch(FileNotFoundException e){ } catch(IOException e){ }finally{ try{ fis.close(); ←コンパイルエラー( 変数 fis は初期化されていない可能性があります。) }catch(IOException e){ } }

    • ベストアンサー
    • Java
  • 中身が一部しかわかっていないXMLの読み方

    XML例 <A> <B> bbb </B> <C> <D> ddd </D> </C> </A> C#でXMLを読み、特定のタグの中身を書き換える処理を実装しようしています。 ただしXMLファイルの中に書き換えたいタグ以外にどんなタグがあるかがわかっていません。 上記の例の場合、 「<A> - <C> - <D>のdddを書き換えたい」ということはわかっています。 この場合どのように行うのがよいでしょうか? ネットでのソースを参考に書き換えたい値のタグが見つかるまで再帰処理を行い タグが見つかった場合値を書き換えるような処理を書いてみました。 よくあるやり方や、もっとスマートな方法が有りましたらご教授お願いします。 また直接関係なくともヒントとなるようなものでも結構です。 よろしくお願いします。 void test() { XmlDocument document = new XmlDocument(); // ファイルから読み込む document.Load(filePath); readXML(document.DocumentElement); } void readXML(XmlNode node) { // if(node.Name == "D") // 書き換えたい値のタグか判定する //{ // 値を書き換える処理 //} if (node.HasChildNodes) { node = node.FirstChild; while (node != null) { readXML(node); node = node.NextSibling; } } }

  • jspでXMLファイルの読み書きは?

    JavaのJSPで、XMLファイルを読み書きしたいと思っております。 サーブレットでは、「import javax.xml.parsers.*;」などを読み込んで処理してますが、 JSPでも、同じように Import してやればよいのでしょうか? また、JSPでも、「Try~catch 」のようなことは、できるのでしょうか? PHPでは、「simplexml_load_file」を使っていました。 Javaには、詳しくないので、お分かりになる方がいらっしゃいましたら、お教えください。

    • ベストアンサー
    • Java
  • javaでファイル操作し検索するものを作ってます

    目的はテキストファイル内の文字列に検索をかけヒットしたものを表示する というものです import java.io.*; class kensakuTest{ public static void main(String[] args)throws IOException{ System.out.println("検索方法を選択してください。\n0:学籍番号で検索\n1:名前で検索\n2:出身地で検索"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //0が選択された場合 if(res == '0'){ System.out.println("学籍番号を入力してください。"); BufferedReader bn = new BufferedReader(new InputStreamReader(System.in)); String str0 = fn.readLine(); char num = str0.charAt(0); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //1が選択された場合 if(res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); char name = str1.charAt(0); try{ FileReader freader = new FileReader("data.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 //部分一致 while((tmp=breader.readLine())!=null){ if(tmp.indexOf(str1) > -1){ System.out.println("結果は:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2'){ System.out.println("出身地を入力してください。"); BufferedReader bl = new BufferedReader(new InputStreamReader(System.in)); String belong = bl.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } } } 現状はここまでできましたが完全一致の検索のやり方がわかりません。 あと問題点があるのですが 読み取るファイルがこのような場合 2000,田中 太郎,福島県 2001,福島 太郎,東京都 名前で福島 と検索をかけたとします この場合答えが 2000,田中 太郎,福島県 2001,福島 太郎,東京都 と表示されてしまいます このカンマで区切られている学籍番号、名前、出身地をうまく分け それぞれ判別する方法はないのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • java ファイル操作

    現在javaでファイル操作しファイルの文字列を検索したりファイルに文字列を追加したりする ものを作成しています。 現状のコードはこのような感じです。 class addresskensaku{ public static void main(String[] args)throws IOException{ System.out.println("数字を選択\n1.名前で検索\n2.年齢で検索\n3.出身地で検索\n4.追加"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //1が選択された場合 if(res == '1' || res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 System.out.println("検索結果 :"); while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[0].indexOf(str1) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2' || res == '2'){ System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String ol = o.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp =null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //完全一致 if (ol.equals(words[1])){ // System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //3が入力された場合 if(res == '3' || res == '3'){ System.out.println("出身地を入力してください。"); BufferedReader p = new BufferedReader(new InputStreamReader(System.in)); String pref = p.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[2].indexOf(pref) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //4が入力された場合 追加 if(res == '4' || res == '4'){ //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader n = new BufferedReader(new InputStreamReader(System.in)); String str2 = n.readLine(); //年齢入力 System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String str3 = o.readLine(); //住所入力 System.out.println("住所を入力してください。"); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); String str4 = a.readLine(); //ファイルに書き込み try{ File file = new File("addressdata.txt"); FileWriter filewriter = new FileWriter(file, true); filewriter.write(str2+","+str3+","+str4+"\r\n"); filewriter.close(); }catch(IOException e){ System.out.println("e"); } } } } これをカプセル化し 各機能ごとにメソッドを分けて作ろうかなと思っています。 結果の出力はmainでやる予定です。