JTree:如何将节点的属性添加为自己的叶子?
JTree: How to add attributes of nodes as their own leaves?
我正在用 javax.swing.JTree
可视化 XML 个文件。使用 this and 问题中的代码后,我被困在将节点的属性作为叶子添加到它。
这个简单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 方法,您需要实现它,因为它通常return true,当该节点没有子节点(childrenCount==0)时,否则为false。你想标记为节点元素而不考虑它们的子节点数,所以你需要 implement/override 这个方法它会 return 你需要的东西。
你的算法也有问题:
您需要检查您的节点是否有子节点,或者只是一个带有叶子的端节点。您需要区分这两者,并实施适当的处理逻辑,这取决于您如何在代码中解释此 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.
上的更正示例作为补充
我正在用 javax.swing.JTree
可视化 XML 个文件。使用 this and
这个简单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 方法,您需要实现它,因为它通常return true,当该节点没有子节点(childrenCount==0)时,否则为false。你想标记为节点元素而不考虑它们的子节点数,所以你需要 implement/override 这个方法它会 return 你需要的东西。
你的算法也有问题:
您需要检查您的节点是否有子节点,或者只是一个带有叶子的端节点。您需要区分这两者,并实施适当的处理逻辑,这取决于您如何在代码中解释此 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.
上的更正示例作为补充