我正在使用以下代码解析小xml文件,并且它正在成功运行。但是当我解析大量数据文件时,我收到了堆栈溢出错误。所以,我决定将此方法转换为迭代样式。最初在编写这个方法时,我创建了逻辑并成功编写了它,但是当转换为迭代样式时,我已经完全丢失并且我没有得到所需的输出。这是我的递归代码:
private void xmlParsing(Node node,int indent) throws IOException {
if (node.hasChildNodes()) {
Node firstChild=node.getFirstChild();
xmlParsing(firstChild,indent+1);
} else {
System.out.println(node.getNodeName()+":"+node.getNodeValue()+":"+indent);
}
Node nextNode=node.getNextSibling();
if (nextNode!=null) {
xmlParsing(nextNode,indent);
}
}
有人可以帮我转换为迭代功能,在单一功能下执行此逻辑吗?我希望我已经提出了明确的要求。
我的完整代码:
package sample;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class NewTestClass {
private Document doc = null;
public NewTestClass() {
BufferedWriter br=null;
try {
doc = parserXML(new File("debug.xml"));
br=new BufferedWriter(new FileWriter("xmldata.txt"));
xmlParsing(doc, 0,br);
} catch(Exception error) {
error.printStackTrace();
} finally {
try {
br.flush();
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void xmlParsing(Node node,int indent,BufferedWriter br) throws IOException {
if (node.hasChildNodes()) {
Node firstChild=node.getFirstChild();
xmlParsing(firstChild,indent+1,br);
} else {
br.write(node.getNodeName()+":"+node.getNodeValue()+":"+indent);
br.newLine();
}
Node nextNode=node.getNextSibling();
if (nextNode!=null) {
xmlParsing(nextNode,indent,br);
}
}
public Document parserXML(File file) throws SAXException, IOException, ParserConfigurationException
{
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
}
public static void main(String[] args)
{
new NewTestClass();
}
}
我的初始错误:
Exception in thread "main" java.lang.StackOverflowError
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeferredTextImpl.synchronizeData(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.CharacterDataImpl.getNodeValue(Unknown Source)
答案 0 :(得分:3)
你的问题是,你也会为兄弟姐妹而不仅仅是为了孩子。子递归完全没问题,但在您的情况下,递归与文档中(扁平化)节点(不仅仅是元素)的数量一样深。
请改为:
private void xmlParsing(Node node, int indent) throws IOException {
// iterate for siblings
while (node != null) {
// recurse for children
if (node.hasChildNodes()) {
Node firstChild = node.getFirstChild();
xmlParsing(firstChild, indent + 1);
} else {
// do the leaf node action
}
node = node.getNextSibling();
}
}
答案 1 :(得分:1)
我认为你有很高的标签嵌套水平。你可以发布你的样本xml文件吗?
如果我理解正确,您正在尝试将xml转换为具有特定格式的文本文件。如果这是要求,我建议你使用XSL和XML进行翻译。它非常简单而且灵活。
您可以在http://speakingjava.blogspot.com/2011/07/how-to-use-xml-and-xsl-in-java.html
找到示例