有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在用javax.swing.JTree可视化XML文件。在使用了来自thisthis问题的代码之后,我一直在将节点的属性作为叶子添加到节点中

这个简单的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;
}

结果不是我想要的:

result

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

下面是我关于Gist的工作示例

编辑:我找到了答案,并回答了下面的问题


共 (2) 个答案

  1. # 1 楼答案

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

    您的算法中还存在一个问题:

    您需要检查节点是否具有节点子节点,或者是否只是具有叶的结束节点。您需要区分这两者,并实现适当的逻辑来处理它们,如何在代码中解释此xml取决于您自己

  2. # 2 楼答案

    好吧,多亏了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;
    

    这产生了我想要的:

    enter image description here

    为了完成此操作,更正了Gist上的示例