在 Java 中使用 SAX 解析器的堆栈溢出错误
Posted
技术标签:
【中文标题】在 Java 中使用 SAX 解析器的堆栈溢出错误【英文标题】:Stack Overflow Error Using SAX Parser in Java 【发布时间】:2011-09-26 03:10:27 【问题描述】:所以我和一个朋友正在做这个项目,我们一直在试图弄清楚如何从 XML 文件中的单个文本节点中提取值。他能够想出一些代码来提取我们正在寻找的文本节点,但是有一个小问题。当我运行以下代码时,它可以正常工作并提取我们需要的内容...
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;
但是,由于这只是我们正在进行的更大项目的一部分,我希望能够将其合并到驱动程序类中。因此我希望能够将这里的 main 方法变成一个构造函数,所以当我改变时......
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.***Error
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】:每次创建 Test 实例时,都会创建一个新的 Test 实例。看到错误了吗?
改为在您的 try 语句中执行此操作:
// DON'T DO THIS: Test saxNames = new Test();
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new File("blabla_filename.xml"), this);
【讨论】:
【参考方案2】:在你的构造函数中,你正在调用你的构造函数......
公共 Test() 尝试 测试 saxNames = new Test(); ...
【讨论】:
哈哈在你发布之前就意识到了这一点:D 因此为什么它主要工作(可以理解)......但我到底需要在这里改变什么才能使构造函数工作?以上是关于在 Java 中使用 SAX 解析器的堆栈溢出错误的主要内容,如果未能解决你的问题,请参考以下文章