# Knoten mittels selbstgebasteltem TreePath öffnen



## sylo (20. Mai 2010)

Hi zusammen

folgendes Problem:

Ich habe ein XML Dokument der wird in einem JTree angezeigt. Nun habe ich die Möglichkeit diesen Baum als Text, also in einer JTextArea, darzustellen. Hier kann ich Änderungen vornehmen und dann wieder zurück in Baumansichten switchen. Ich möchte nun, wenn ich vom TextModus wieder zurück in den BaumModus zurückspringe, dass der alte geöffnete Knoten wieder offen ist.

Dazu speichere ich mir den Knoten bevor ich in den TextModus wechsle als TreePath. Da ich aber ein neues Document-Objekt laden muss (es könnte ja jemand im TextModus Werte ändern), kann ich den mir zuvor gemerkten TreePath nicht mehr anwenden. Dann spuckt er mir einen Fehler mit "DOM005 Wrong document" oder so ähnlich.

Kein Problem dachte ich mir und habe mir die Knotennamen aus dem TreePath genommen und mir mein eigenes, neues Treepath gebastelt. 


```
int tempCount = tempPath.getPathCount();
	
		Node node = (Node)tempPath.getLastPathComponent();
		ArrayList<Node> nl = new ArrayList<Node>();
		nl.add(node);
		for (int i=0; i < tempCount-1; i++){
			node = node.getParentNode();
			nl.add(node);
		}
		Collections.reverse(nl);
		
		Node[] ggg = new Node[nl.size()];
		for (int i = 0; i < nl.size(); i++){
			ggg[i] = nl.get(i);
		}
		
		TreePath fff = new TreePath(ggg);
		
		jTreeTable.getTree().expandPath(fff);
```
Verzeiht mir die Namensgebung der Variablen.
tempPath ist der vorher gemerkte TreePath.

Trotzdem öffnet er mir den Baum nicht. Ganz am Ende steht in fff dann auch ein Wert wie [[Knoten1],[Knoten2],[Knoten3]]. Also so wie es sein sollte.

Bin für jeden Tipp dankbar.

Grüße
sylo


----------



## sylo (25. Mai 2010)

Keiner einen Tipp!!


----------



## sylo (27. Mai 2010)

Hi zusammen

Habe es hinbekommen, weiß aber nicht ob das so eine optimale Lösung ist. Habe es mit Hilfe XPath hinbekommen.


```
Node[] pathNodes = null;

				if (tempPath != null) {
					pathNodes = new Node[tempPath.getPathCount()];
					String[] nodeNames = new String[tempPath.getPathCount()];
					for (int i = 0; i < tempPath.getPathCount(); i++) {
						nodeNames[i] = ((Node) tempPath.getPathComponent(i)).getNodeName();
					}

					XPath xpath = XPathFactory.newInstance().newXPath();
					String nodeName = "";
					XPathExpression expr;
					Object result;
					NodeList nodes;

					for (int i = 0; i < nodeNames.length; i++) {

						if (i == nodeNames.length - 1) {
							nodeName = nodeName + "/" + nodeNames[i] + "[" + tempPosition + "]";
						} else {
							nodeName = nodeName + "/" + nodeNames[i];
						}

						expr = xpath.compile(nodeName);
						result = expr.evaluate(parser.getDomXML(), XPathConstants.NODESET);
						nodes = (NodeList) result;
						pathNodes[i] = nodes.item(0);
					}
				}
```

zum Code:
Ich hole mir aus dem alten Pfad(tempPath) die einzelnen Node-Namen raus un bastle mir daraus meine expression für den XPath. In "tempPosition wird bei mehreren Knoten mit gleichem Namen die Position gemerkt.

Grüße
sylo


----------

