2016-07-19 17 views
-2

これで、xmlファイルを解析するためにsaxパーサを使用しました(次のサンプルコードはtutorialspointにあります)。文字関数を呼び出すときにBufferedWriterを使ってすべてのものをtxtファイルに出力したいのですが、これを行う方法はありません。このBufferedWriterをcharacters関数に書き込むと、最後の呼び出しのみが記録されるため、最後の文字列が出力されます。このBufferedWriterをmain関数に書き込むと、2つのクラスであるため、UserHandlerはmain関数(dblpSaxクラス)で作成されたBufferedWriterを認識できませんでした。私はまだクラスのインスタンスを作るためにsthを試しましたが、私はまだ問題を抱えていました。これを作る方法を私に教えてください。ありがとう。あなたがたDefaultHandler外最高のカスタマイズ可能な構文解析、と同じレベルにBufferedWriterのを必要とするメイン関数からBufferedWriterを書き込む方法

File writename = new File("output.txt"); 
writename.createNewFile(); 
BufferedWriter out = new BufferedWriter(new FileWriter(writename)); 



    public class dblpSax{ 
    public static void main(String[] args){ 

     try { 
     File inputFile = new File("student.txt"); 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 
     UserHandler userhandler = new UserHandler(); 
     saxParser.parse(inputFile, userhandler);  
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 


class UserHandler extends DefaultHandler { 

    boolean bFirstName = false; 
    boolean bLastName = false; 
    boolean bNickName = false; 
    boolean bMarks = false; 


    public void startElement(String uri, 
     String localName, String qName, Attributes attributes) 
     throws SAXException { 
     if (qName.equalsIgnoreCase("student")) { 
     String rollNo = attributes.getValue("rollno"); 
     System.out.println("Roll No : " + rollNo); 
     } else if (qName.equalsIgnoreCase("firstname")) { 
     bFirstName = true; 
     } else if (qName.equalsIgnoreCase("lastname")) { 
     bLastName = true; 
     } else if (qName.equalsIgnoreCase("nickname")) { 
     bNickName = true; 
     } 
     else if (qName.equalsIgnoreCase("marks")) { 
     bMarks = true; 
     } 
    } 


    public void endElement(String uri, 
     String localName, String qName) throws SAXException { 
     if (qName.equalsIgnoreCase("student")) { 
     System.out.println("End Element :" + qName); 
     } 
    } 


    public void characters(char ch[], 
     int start, int length) throws SAXException { 
     if (bFirstName) { 
     System.out.println("First Name: " 
     + new String(ch, start, length)); 
     bFirstName = false; 
     } else if (bLastName) { 
     System.out.println("Last Name: " 
     + new String(ch, start, length)); 
     bLastName = false; 
     } else if (bNickName) { 
     System.out.println("Nick Name: " 
     + new String(ch, start, length)); 
     bNickName = false; 
     } else if (bMarks) { 
     System.out.println("Marks: " 
     + new String(ch, start, length)); 
     bMarks = false; 
     } 
    } 
} 
+0

問題は何ですか?注意 'createNewFile()'呼び出しは上で重複しています。 – EJP

+0

私たちが文字関数を呼び出すときにBufferedWriterを使って.txtファイルにすべてのものを出力したいのですが、問題はBufferedWriterの使い方ですか? – michael

答えて

0

次のように私が使用したい

Bufferwriterです。

 try (BufferedWriter out = new BufferedWriter(....)) { 
      UserHandler userhandler = new UserHandler(out); 
      saxParser.parse(inputFile, userhandler);  
     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 

クラスUserHandlerがたDefaultHandler { プライベート最終BufferedWriterのを延出し、 //またはPrintWriter

UserHandler(BufferedWriter out) { 
    this.out = out; 
} 

そして、すべてがout.write everywhereできます。

+0

ありがとうJoop。これは本当に助けになり、構築方法でクラス間でやりとりする方法を学びます。あなたの素敵なおかげで誰かがマイナスマークをくれた! (私は彼らが慎重に笑っていないと思うのですが) – michael

関連する問題