我从头开始构建XML文档。我写了一个类来插入和遍历元素到XML中。这是它:XML文档转换StackOverflowError
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class XMLParser {
private Document doc;
private Node currentNode;
public XMLParser(String path) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.newDocument();
currentNode = doc.createElement("Root");
((Element) currentNode).setAttribute("Path", path);
doc.appendChild(currentNode);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public XMLParser add(String name){
currentNode = currentNode.appendChild(doc.createElement(name));
return this;
}
public XMLParser attr(String name, String value){
((Element) currentNode).setAttribute(name, value);
return this;
}
public XMLParser set(String value){
currentNode = currentNode.appendChild(doc.createTextNode(value));
return this;
}
public XMLParser up(){
currentNode = currentNode.getParentNode();
return this;
}
public String toXML(){
final Transformer transformer;
try {
transformer = TransformerFactory.newInstance().newTransformer();
} catch (final TransformerConfigurationException ex) {
throw new IllegalStateException(ex);
}
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
final StringWriter writer = new StringWriter();
try {
transformer.transform(
new DOMSource(doc),
new StreamResult(writer)
);
} catch (final TransformerException ex) {
throw new IllegalArgumentException(ex);
}
return writer.toString();
}
}
现在我可以像 “新XMLParser的(” “)调用添加(” A “)上()加(” B “)toxml用于();”。生成一个包含XML代码的字符串。
这toxml用于中(的伟大工程,对于较小的文件,但如果XML越来越大,我得到一个#1,错误在transformer.transform(...)):
Exception in thread "main" java.lang.StackOverflowError
at com.sun.org.apache.xml.internal.serializer.ToStream.characters(Unknown Source)
at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(Unknown Source)
at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source)
...[1000 lines in console buffer displayed]
没有人有关于如何最小化堆栈开销的想法?我不想摆弄JVM设置,因为我希望它可以在不同的计算机上运行...
在此先感谢您的想法或解决方案!
编辑: 这里是被称为与横贯内的文件夹来创建XML树出来的目录
private void stepAhead(File f) throws IOException {
if(f.isDirectory()){
File[] ergebnis = f.listFiles();
ArrayList<File> dateien = new ArrayList<File>();
for (File temp : ergebnis) {
if (temp.isDirectory()){
//System.out.println("Checking Directory: " + temp.getCanonicalFile());
xml.add("Dir").attr("Name", temp.getName());
stepAhead(temp);
xml.up();
}
else if(temp.isFile()){
dateien.add(temp);
}
else{
throw new RuntimeException("Keine Datei und kein Ordner");
}
}
for(File temp : dateien){
BasicFileAttributes attributes = Files.readAttributes(temp.toPath(), BasicFileAttributes.class);
xml.add("File");
xml.add("Name").set(temp.getName()).up();
xml.add("Size").set(""+attributes.size()).up();
xml.add("DateCreated").set(formatFileTime(attributes.creationTime())).up();
xml.add("DateLastModified").set(formatFileTime(attributes.lastModifiedTime())).up();
xml.up();
}
}
}
的内容的目录中的Java文件对象的递归码XML是XMLParser的对象,我只是initialze它在构造函数中
出现StackOverflow通常意味着有一些错误在您的代码中,而不是在JVM配置中。你能发布触发错误的代码吗? – Raffaele
在使用xml/dom Java解决方案进行封装前,我使用了外部库来构建xml,并且没有溢出。 我在想这是转换,因为如果我删除转换,我不会得到一个结果,但它正在完成没有错误 –