所以一個朋友和我正在研究這個項目,我們一直在試圖弄清楚如何從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,只是獨自標題:) – Perception