繁体   English   中英

JTree:如何将节点的属性添加为自己的叶子?

[英]JTree: How to add attributes of nodes as their own leaves?

我正在用javax.swing.JTree可视化XML文件。 已经从使用的代码这个这个问题,我被困在离节点添加的属性留给它。

这个简单的XML:

<?xml version="1.0" encoding="utf-8"?>
<!-- comment -->
<MYXML xmlns="">
    <Header id=""></Header>
    <Product id="" name="">
        <Description>Some text</Description>
        <Ref id=""></Ref>
        <Data id="">
            <Ref id=""></Ref>
        </Data>
        <Form id=""></Form>
    </Product>
</MYXML>

被解析为org.w3c.dom.Document并作为org.w3c.dom.Node传递以递归地构建JTree:

private DefaultMutableTreeNode buildTreeNode(Node rootNode) {
    DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(
            rootNode.getNodeName());
    NodeList children = rootNode.getChildNodes();

    for (int i = 0; i < children.getLength(); i++) {
        Node node = children.item(i);
        short nodeType = node.getNodeType();

        if (nodeType == Node.ELEMENT_NODE) {
            treeNode.add(buildTreeNode(node));

            // FIXME attributes should be leaves of their nodes
            if (node.hasAttributes()) {
                NamedNodeMap attributes = node.getAttributes();
                for (int j = 0; j < attributes.getLength(); j++) {
                    Node attr = attributes.item(j);
                    treeNode.add(new DefaultMutableTreeNode("@" + attr));
                }
            }
        } else if (nodeType == Node.TEXT_NODE) {
            String text = node.getTextContent().trim();
            if (!text.equals("")) {
                treeNode.add(new DefaultMutableTreeNode(text));
            }
        } else if (nodeType == Node.COMMENT_NODE) {
            String comment = node.getNodeValue().trim();
            treeNode.add(new DefaultMutableTreeNode("#" + comment));
        }
    }
    return treeNode;
}

结果不是我想要的:

结果

叶子“ Header”,“ Ref”和“ Form”应为节点,所有属性(标记为@ )应为其节点的叶子。 如何使用递归方法实现这一目标?

这是我关于Gist的工作示例。

编辑 :我想通了,并在下面回答了我的问题。

TreeNode中有一个isLeaf方法,您需要实现它,因为当该节点没有子节点(childrenCount == 0)时,它通常返回true,否则返回false。 您希望将其标记为节点元素,而不管其子节点数如何,因此您需要实现/覆盖此方法,以使其返回所需的内容。

您的算法中也有一个问题:

您需要检查您的节点是否有子节点,或者仅是具有叶子的末端节点。 您需要区分这两者,并实施适当的逻辑来处理,这取决于您如何在代码中解释此xml。

好了,感谢Krzysztof的提示,我终于对它进行了整理。 现在,带有子节点的节点已得到正确处理,并且属性叶位于它们应位于的位置:

private DefaultMutableTreeNode buildTreeNode(Node rootNode) {
    DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(
            rootNode.getNodeName());

    if (rootNode.hasAttributes()) {
        NamedNodeMap attributes = rootNode.getAttributes();

        for (int j = 0; j < attributes.getLength(); j++) {
            String attr = attributes.item(j).toString();
            treeNode.add(new DefaultMutableTreeNode("@" + attr));
        }
    }

    if (rootNode.hasChildNodes()) {
        NodeList children = rootNode.getChildNodes();

        for (int i = 0; i < children.getLength(); i++) {
            Node node = children.item(i);
            short nodeType = node.getNodeType();

            if (nodeType == Node.ELEMENT_NODE)
                treeNode.add(buildTreeNode(node));

            else if (nodeType == Node.TEXT_NODE) {
                String text = node.getTextContent().trim();
                if (!text.equals(""))
                    treeNode.add(new DefaultMutableTreeNode(text));

            } else if (nodeType == Node.COMMENT_NODE) {
                String comment = node.getNodeValue().trim();
                treeNode.add(new DefaultMutableTreeNode("#" + comment));
            }
        }
    }
    return treeNode;

产生我想要的东西:

在此处输入图片说明

为了完整起见 ,更正了Gist的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM