从Java中具有奇怪行为的XML递归打印树结构

时间:2013-10-11 23:41:07

标签: java xml parsing recursion vtd-xml

我正在读取XML文件并重新创建重新打印的结构,减去所有属性,值和文本。据我所知,它的工作正常,但当我尝试在控制台中重新打印时,我会得到非常奇怪的行为。

for( xmlNode n : treeNodes )
    {
        System.out.println( n.getLabel() );
        printChildNodes( n, 1 );
    }


private static void printChildNodes( xmlNode n, int indent )
{
    for( int i = 0; i < indent; i++ )
    {
        System.out.print( indent );
    }

    for( xmlNode child : n.getChildren() )
    {
        System.out.println( child.getLabel() + " " + indent );
        printChildNodes( child, indent+1 );
    }
}

我得到以下输出

ROOT
1A 1
22B 2
333C 3
4444D 4
55555E 5
666666D 4
55555E 5
666666D 4
55555E 5
666666D 4

最初我是打印“\ t”而不是缩进,但我注意到结构看起来不对。现在,我正在摸不着机器中可能出现的重影导致我的“缩进”变量有两个单独的值而没有对其进行任何更改。更不用说奇怪的事情在某种程度上是可以预测的。 D元素应该在E的左边而不是右边(因为它们是E的父母)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您只在节点的第一行开头打印一次“缩进”(实际上是很多数字)。

然后在每个孩子之后打印换行符。 “缩进”只会在第一个孩子之前。

您也不打印正在访问的节点,但只打印孩子。这是错误的,当节点本身没有显示/只是一个虚假的缩进时,输出将在没有孩子时非常混乱。

此外,您迭代treeNodes并调用printChildNodes函数 - 但这是递归的。理想情况下,我只希望一个递归函数来打印&amp;下降整个子树,没有循环。

printTree( rootNode, 0);

private static void printTree (xmlNode n, int indent) {
    StringBuilder ind = new StringBuilder();
    for (int i = 0; i < indent; i++)
        ind.append(' ');

    // print the Node;
    //
    System.out.println( ind + n.getLabel());

    // traverse Descendants.
    //
    for (xmlNode child : n.getChildren()) {
        printTree( child, indent+1);
    }
}

这应该是非常万无一失的。