Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将二叉搜索树转换为XML_Java_Xml_Processing_Binary Search Tree_Data Visualization - Fatal编程技术网

Java 将二叉搜索树转换为XML

Java 将二叉搜索树转换为XML,java,xml,processing,binary-search-tree,data-visualization,Java,Xml,Processing,Binary Search Tree,Data Visualization,我正在尝试将二元搜索树转换为XML,以使用处理编程语言绘制它。我面临的问题是关闭标签位置不正确。 这是生成XML的Java代码 public void toXML() { Stack<String> tags = new Stack<>(); PrintWriter pw = null; try { pw = new PrintWriter("tree.xml"); } catch (IOException e) {

我正在尝试将二元搜索树转换为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>");
}
public void toXML(){
堆栈标记=新堆栈();
PrintWriter pw=null;
试一试{
pw=新的PrintWriter(“tree.xml”);
}捕获(IOE异常){
e、 printStackTrace();
}
pw.println(“”);
toXMLHelper(this.root,pw,tags,“root”);
而(!tags.isEmpty())
println(tags.pop().toString());
pw.flush();
关闭();
}
私有void toXMLHelper(BSTP节点、PrintWriter pw、堆栈标记、字符串位置){
如果(p!=null){
添加标签(p、pw、标签、位置);
if(p.left==null&&p.right==null)
println(tags.pop().toString());
toXMLHelper(p.left,pw,标签,“left”);
toXMLHelper(p.right,pw,tags,“right”);
}
}
私有void addTag(BSTP节点、PrintWriter pw、堆栈标记、字符串位置){
pw.println(“+p.el.toString());
标签。按(“”);
}
下面是生成的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>

8.
4.
2.
7.
9

其中一个底部结束标记应位于节点7结束标记的下方。我怎样才能把它修好呢
我尝试使用XML编码器,但它生成了太多不必要的标记。

我相信您试图用错误的方法来处理这个问题。 更简单的方法是在每个元素上递归,而不是将它们的标记保存在堆栈中

好了:

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>");
}
publicprintwriter bstoxml(){
try(PrintWriter pw=newprintWriter(“tree.xml”)){
pw.println(“”);
bstToXMLHelper(this.root,pw,“root”);
返回pw;
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
私有void bstToXMLHelper(BSTNode节点、PrintWriter pw、字符串位置){
if(node==null){
返回;
}
println(“+node.el.toString());
if(node.left!=null){
bstToXMLHelper(node.left,pw,“left”);
}
if(node.right!=null){
bstToXMLHelper(node.right,pw,“right”);
}
pw.println(“”);
}
希望能有帮助