我正在尝试将二进制搜索树转换为XML,以便使用处理编程语言进行绘制。我面临的问题是关闭标签位置不正确。 这是生成XML的Java代码
public void toXML() {
Stack<String> tags = new Stack<>();
PrintWriter pw = null;
try {
pw = new PrintWriter("tree.xml");
} catch (IOException e) {
e.printStackTrace();
}
pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
toXMLHelper(this.root, pw, tags, "root");
while(!tags.isEmpty())
pw.println(tags.pop().toString());
pw.flush();
pw.close();
}
private void toXMLHelper(BSTNode<T> p, PrintWriter pw, Stack<String> tags, String place) {
if (p != null) {
addTag(p, pw, tags, place);
if(p.left == null && p.right == null)
pw.println(tags.pop().toString());
toXMLHelper(p.left, pw, tags, "left");
toXMLHelper(p.right, pw, tags, "Right");
}
}
private void addTag(BSTNode<T> p, PrintWriter pw, Stack<String> tags, String place) {
pw.println("<node place=\"" + place + "\">" + p.el.toString() );
tags.push("</node>");
}
这是生成的XML
<?xml version="1.0" encoding="UTF-8"?>
<node place="root">8
<node place="left">4
<node place="left">2
</node>
<node place="Right">7
</node>
<node place="Right">9
</node>
</node>
</node>
最下面的结束标记之一应放在节点7的结束标记之下。我该如何解决这个问题呢? 我尝试使用XML编码器,但它会生成过多不必要的标签。
答案 0 :(得分:1)
我相信您正在尝试以错误的方式进行检查。 一种更简单的方法是遍历每个元素,而不是将其标签保存在堆栈中。
去那里:
public PrintWriter bstToXML() {
try (PrintWriter pw = new PrintWriter("tree.xml")) {
pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
bstToXMLHelper(this.root, pw, "root");
return pw;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void bstToXMLHelper(BSTNode node, PrintWriter pw, String place) {
if(node == null) {
return;
}
pw.println("<node place=\"" + place + "\">" + node.el.toString());
if(node.left != null){
bstToXMLHelper(node.left, pw, "left");
}
if(node.right != null) {
bstToXMLHelper(node.right, pw, "right");
}
pw.println("</node>");
}
希望有帮助。