2011-06-30 59 views
2

所以一個朋友和我正在研究這個項目,我們一直在試圖弄清楚如何從XML文件中的單個文本節點中提取值。他能夠拿出一些代碼來提取我們正在尋找的文本節點,但是有一個小問題。當我運行下面的代碼,它工作正常,並提取我們需要什麼...在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) 

我不知道爲什麼它這樣做。仔細查看代碼,我想我可能會知道錯誤來自哪裏。在構造函數中,它以相同的名稱實例化另一個構造函數--->因此,它爲什麼在主方法中起作用。但是,我不確定如何解決這個問題?

+1

+1,只是獨自標題:) – Perception

回答

5

您每次創建一個Test實例時,都會創建一個Test的新實例。看到錯誤?

這樣做是不是您試穿聲明:

// 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 因此爲什麼它工作在主(理解) ...但是,我需要在這裏修改哪些內容才能使該構造函數有效? –