你能帮我理解一下这段Java代码吗?

时间:2013-09-04 01:31:04

标签: java xml

我正在开发一个需要加载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“变量”,使第一个语句无用。但是,如果我取出第一个语句,代码将不再正常工作。事实上,如果我拿出任何一个声明,它就不再适用了。这两个语句都是元素添加到树中所必需的。

你能告诉我这里发生了什么吗?我只是不明白。

提前致谢,

史蒂夫

3 个答案:

答案 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的子项,即新创建的节点

_base.add(current);

现在你已经完成了这个:

  • _base(没有孩子)
    • 当前(孩子)

最后

_base = current;

现在你有了

  • (_base的父母)(旧基地)
    • _base / current

_base的引用现在指向新创建的孩子。当您致电endElement时,您将退出_base并返回原来的_base

_base正在存储您当前正在处理的xmlElement。当您致电startElement时,对setAttributestartElement的所有来电均以此为基础。

内容:

以下是代码中显示的内容:

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>