2

我正在读取一个 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 的父级)。

有任何想法吗?

4

1 回答 1

1

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

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

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

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

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);
    }
}

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

于 2013-10-11T23:55:40.297 回答