我正在开发一个需要加载XML文件的小项目。我发现了一个很好的代码示例,它扩展了DefaultHandler,并使用自定义的TreeRender将XML格式化为树视图here。代码编译并运行(总是一个加号),并给我一个我正在寻找的起点,但在代码中有一些我不理解的小东西。
以下是我没有得到的代码段:
public class XmlTreeView extends DefaultHandler {
private DefaultMutableTreeNode _base;
<snip>
@Override
public void startElement(String uri, String localName, String tagName, Attributes attr) throws SAXException {
System.out.println("startElement: uri=" + uri + " localname=" + localName + " tagName=" + tagName );
DefaultMutableTreeNode current = new DefaultMutableTreeNode(tagName);
_base.add(current);
_base = current;
for (int i = 0; i < attr.getLength(); i++) {
// <snip> attribute processing
}
}
该类声明一个名为_base的DefaultMutableTreeNode。 startElement()方法实例化一个名为current的新DefaultMutableTreeNode,然后执行
_base.add(current);
_base = current;
我的所有编程知识告诉我第二个语句将新对象(当前)分配给_base“变量”,使第一个语句无用。但是,如果我取出第一个语句,代码将不再正常工作。事实上,如果我拿出任何一个声明,它就不再适用了。这两个语句都是元素添加到树中所必需的。
你能告诉我这里发生了什么吗?我只是不明白。
提前致谢,
史蒂夫
答案 0 :(得分:3)
_base
是对象的引用。当您说_base.add(current)
时,您正在调用一个对该对象进行一些更改的方法。当您说_base = current;
时,_base
将成为对其他对象的引用。但第一个目标仍然存在。无论你做了什么改变,它仍然可以影响程序的其余部分,如果在其他地方有引用它的话。
答案 1 :(得分:2)
这些变量名称错误,导致大部分混淆。
字段_base
应该被称为currentNode
,而startElement
中创建的新节点应该类似于childNode
。
这是相同的代码,但使用这些新的变量名重写:
currentNode.add(childNode);
currentNode= childNode;
因此,当您在XML文件中输入start元素时,我们会创建一个新节点并将其添加到XML树结构的Object表示中。我们刚刚开始的新子元素作为子元素添加到当前节点。然后我们将当前节点的引用更改为指向此新子节点。这使新子节点成为当前节点。
我假设在代码中你没有显示,有一个endElement
我们在那里进行反向操作并将树向上移动到currentNode的父级。
答案 2 :(得分:0)
你脑子里有一段奇怪的代码,但这就是发生的事情:
private DefaultMutableTreeNode _base;
作为班级的全球currentNode
。当你致电startElement
时,你正在这样做:
DefaultMutableTreeNode current = new DefaultMutableTreeNode(tagName);
//Create a new TreeNode item based off the tagName
所以你现在有:
现在,您要添加_base
的子项,即新创建的节点
_base.add(current);
现在你已经完成了这个:
最后
_base = current;
现在你有了
_base
的引用现在指向新创建的孩子。当您致电endElement
时,您将退出_base
并返回原来的_base
_base
正在存储您当前正在处理的xmlElement。当您致电startElement
时,对setAttribute
或startElement
的所有来电均以此为基础。
内容:
以下是代码中显示的内容:
XmlWriter xWriter;
xWriter.startElement("NPC"); //_base becomes new node "hello"
xWriter.startAttribute("Greeting", "Hi"); //attribute is now set to _base (or greeting)
xWriter.startElement("Data"); //_base becomes new node "data"
xWriter.startAttribute("Height", "200"); //attribute is now set to _base (or data)
xWriter.endElement(); //on end element you move to parent of data, so greeting
xWriter.endElement(); //again you move to the parent
创建:
<NPC Greeting='Hi'>
<Data Height='200'/>
</NPC>