2011-06-30 10 views
2

このプロジェクトでは、友人と私はこのプロジェクトを進めており、XMLファイル内の個々のテキストノードから値を引き出す方法を見つけようとしていました。彼は私たちが探しているテキストノードを抽出する少しのコードを考え出すことができましたが、わずかな問題が1つあります。私は、次のコードを実行すると、それが正常に動作し、私たちが必要なものを抽出し...JavaでSAXパーサーを使用しているスタックオーバーフローエラー

Javaコード

import java.io.File; 
import org.xml.sax.*; 
import org.xml.sax.helpers.DefaultHandler; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

public class Test extends DefaultHandler 
{ 
    StringBuffer buffer; 
    String heading; 
    boolean inHeading; 

    public static void main(String[] args) 
    { 
     try 
     { 
      Test saxNames = new Test(); 
      SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 

      parser.parse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne.docx - Extracted Items/word/document.xml"), saxNames); 

     } 
     catch(Exception e) 
     { 
      e.printStackTrace(System.err); 
     } 
    } 

    public void startElement(String uri, String localName, String qName, Attributes attrs) 
    { 
     if ("w:pStyle".equals(qName)) 
     { 
      String val = attrs.getValue("w:val"); 

      if (val.contains("Heading")) 
      { 
       if (isHeading(val)) 
       { 
        System.out.println(val); 
        inHeading = true; 
       } 
      } 
     } 



     if("w:t".equals(qName)) 
     { 
      String val = attrs.getValue("w:t"); 
      if (inHeading == true) 
      { 
       buffer = new StringBuffer(); 
      } 
     } 
    } 

    public void characters(char buff[], int offset, int length) throws SAXException 
    { 
     String s = new String(buff, offset, length); 

     if(buffer != null) 
     { 
      buffer.append(s); 
      heading = heading += s; 
     } 
    } 

    public void endElement(String uri, String localName, String qName) 
    { 
     buffer = null; 

     if ("w:p".equals(qName) && inHeading == true) 
     {  
      System.out.println(heading);   

      heading = ""; 
      inHeading = false;  
     } 
    } 

    private static boolean isHeading(String heading) 
    { 
     String headingNumber = heading.substring(7,8); 
     String headingName = heading.substring(0,7); 

     if (headingName.equals("Heading")) 
     { 
      if (headingNumber.equals("1") 
        || headingNumber.equals("2") 
        || headingNumber.equals("3") 
        || headingNumber.equals("4") 
        || headingNumber.equals("5") 
        || headingNumber.equals("6")) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

これは大きなプロジェクトの一部のみであるため、しかし、我々は取り組んでいます、私はこれをドライバクラスに組み込みたいと思っています。したがって、私は、コンストラクタにここでの主な方法を回すことができるようにしたい、と私は変更したときに...

public static void main(String[] args) 
     { 
      try 
      { 
       Test saxNames = new Test(); 
       SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 

       parser.parse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne.docx - Extracted Items/word/document.xml"), saxNames); 

      } 
      catch(Exception e) 
      { 
       e.printStackTrace(System.err); 
      } 
     } 

public Test() 
     { 
      try 
      { 
       Test saxNames = new Test(); 
       SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 

       parser.parse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne.docx - Extracted Items/word/document.xml"), saxNames); 

      } 
      catch(Exception e) 
      { 
       e.printStackTrace(System.err); 
      } 
     } 

....にそして、私がしようとしたときにドライバからこれを実行すると、次のエラーが発生します....

Exception in thread "main" java.lang.StackOverflowError 
    at Test.<init>(Test.java:17) 
    at Test.<init>(Test.java:17) 
    at Test.<init>(Test.java:17) 
    at Test.<init>(Test.java:17) 
    at Test.<init>(Test.java:17) 
     . 
     . 
     . 
    at Test.<init>(Test.java:17) 

私はこれをやっている理由を知りません。コードを調べると、どこからエラーが発生しているのか分かります。コンストラクタ内では、別のコンストラクタを同じ名前でインスタンス化します--->したがって、なぜmainメソッドで動作しますか?しかし、私はその問題にどのように対処するのか本当にわからないのですか?

+1

+1を、言葉だけでタイトルのために:) – Perception

答えて

5

Testのインスタンスを作成するたびに、Testの新しいインスタンスを作成します。エラーを見ますか?

代わりにあなたのtry文でこれを行いますuは掲載前に

// DON'T DO THIS: Test saxNames = new Test(); 

SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 

parser.parse(new File("blabla_filename.xml"), this); 
+0

それはすごくうまくいった!どうもありがとう :) –

3

あなたのコンストラクタでは、あなたのコンストラクタ...

公共テスト() { { テストsaxNamesを= 新しいテスト()してみてくださいを呼び出しています。 ...

+0

笑それを実現:D をので、それがメイン(理解しやすい)で動作する理由...コンストラクタを動作させるためには、ここで変更する必要があるのは何ですか? –

関連する問題