0

XML ファイルの読み込みが必要な小さなプロジェクトに取り組んでいます。DefaultHandler を拡張し、カスタム TreeRender を使用して XML をツリービューにフォーマットする素敵なコード サンプルを見つけまし。コードはコンパイルおよび実行され (常にプラス)、探している開始点が得られますが、コードで理解できないことが 1 つあります。

取得できないコードスニペットは次のとおりです。

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;

私のすべてのプログラミング知識は、2 番目のステートメントが新しいオブジェクト (現在の) を _base の「変数」に割り当て、最初のステートメントを役に立たなくしていることを教えてくれます。ただし、最初のステートメントを取り出すと、コードが正しく機能しなくなります。実際、どちらかのステートメントを取り出すと、正しく機能しなくなります。要素をツリーに追加するには、両方のステートメントが必要です。

ここで何が起こっているのか説明してもらえますか? 私はそれを理解していません。

前もって感謝します、

スティーブ

4

3 に答える 3

3

_baseオブジェクトへの参照です。と言うとき_base.add(current)、そのオブジェクトに何らかの変更を加えるメソッドを呼び出しています。次に と言うと 、別のオブジェクトへの参照になります_base = current;_baseしかし、最初のオブジェクトはまだそこにあります。また、どこか別の場所への参照がある場合、変更を加えてもプログラムの残りの部分に影響を与える可能性があります。

于 2013-09-04T01:37:18.527 に答える
2

これらの変数の名前は不適切であり、混乱の原因となっています。

フィールド_baseは実際には のように呼ばcurrentNodeれ、 で作成された新しいノードは のstartElementようになりますchildNode

以下は同じコードですが、これらの新しい変数名を使用して書き直されています。

currentNode.add(childNode);
currentNode= childNode;

XML ファイルに開始要素を入力すると、新しいノードが作成され、XML のツリー構造のオブジェクト表現に追加されます。開始したばかりの新しい子要素が、現在のノードに子として追加されます。次に、現在のノードの参照を変更して、この新しい子ノードを指すようにします。これにより、新しい子ノードが現在のノードになります。

あなたが示していないコードでendElementは、逆の操作を行い、ツリーを currentNode の親に移動する場所があると仮定します。

于 2013-09-04T01:39:52.797 に答える