# JDOM Elemente suchen



## shiRiaRu (12. Dez 2003)

Ich beschäftige mich momentan mit JDOM und der Suche von Elementen in einem Dokument. 
Mein derzeitiges Problem besteht darin, dass ich Elemente bei absoluter Namensgleichheit finden möchte.
Mein Ziel ist es in einem Dokument wo auch alle Knoten gleich sein können den richtigen zu finden damit ich.
weitere Knoten an dem gesuchten abändern / löschen etc kann.

Als Beispiel sei die untere XML gegeben:

(Das Attribut ident habe ich zur eigenen Orientierung eingebaut: Es gibt die Tiefe der Knoten an.)

Grundlage für die suchbegriffe bietet momentan ein JTree:
Ich übergebe der Methode oldSearchElement

1) ein JDOM Element (am Anfang ist es das Root Element des Dokuments)
2) Einen Sichstring (in dem Falle ist es der Name des Knoten aus der JTree-Ansicht)
3) int nodelevel -> Knotentiefe im JTree
4) int nodeposition -> Position beim Parent ( z.b  3ter von 4 Knoten an einem Beliebigen Knoten )

Momentan benutzte ich nur nodeposition und searchname und konnte die Suchergebnisse 
schon stark einschränken. Kann man so eine Suche nicht vielleicht einfacher machen ? 
Hat da jemand erfahrung ?



```
<?xml version="1.0" encoding="UTF-8"?>
<tiere>
    <reptilien ident="reptilien-1.0">
		<reptilien ident="reptilien-1.1">
			<reptilien ident="reptilien-1.1.1">reptilien</reptilien>
			<reptilien ident="reptilien-1.1.2">reptilien</reptilien>
			<reptilien ident="reptilien-1.1.3">reptilien</reptilien>
      	</reptilien>
    </reptilien>
         
    <reptilien ident="reptilien-2.0">
		<reptilien ident="reptilien-2.1">
			<reptilien ident="reptilien-2.1.1">reptilien</reptilien>
			<reptilien ident="reptilien-2.1.2">reptilien</reptilien>
			<reptilien ident="reptilien-2.1.3">reptilien</reptilien>
      	</reptilien>
    </reptilien>
        
    <reptilien ident="reptilien-3.0">
		<reptilien ident="reptilien-3.1">
			<reptilien ident="reptilien-3.1.1">reptilien</reptilien>
			<reptilien ident="reptilien-3.1.2">reptilien</reptilien>
			<reptilien ident="reptilien-3.1.3">reptilien</reptilien>
      	</reptilien>
    </reptilien>
</tiere>
```




```
public static Element oldSearchElement(Element givenEL,String searchname,int nodelevel,int nodeposition)
{       
	List listMainElements = givenEL.getChildren();
	for(int i=0; i<listMainElements.size();i++)
	{
		givenEL = (Element)(listMainElements.get( i ));
		oldSearchElement(givenEL,searchname,nodelevel,nodeposition);
		
		if(givenEL.getName() == searchname  && nodeposition == i )
   		{
			TextIO.putln("Sind gleich: "+"Suchbegriff ->"+searchname+" und Elementname ->"+givenEL.getName());
			TextIO.putln("(i)->"+i+"(nodeposition)->"+nodeposition);
			foundEL = givenEL;
			counter++;
		}  		
	}
	return foundEL;
}
```



mfg shiRiaRu


----------



## René Link (12. Jan 2004)

Hi,

wenn ich dich richtig verstehe, traversierst du den XML-Baum selbst um die Knoten zu finden.
Das ist aber nicht nötig. Es gibt doch immerhin XPath.
XPath ist eine Art Query-Language. Sowie SQL für relationale Datenbanken.
Es gibt eine XPath Implementierung von http://xml.apache.org/xalan-j

In der Javadoc findest du im Paket org.apache.xpath die Klasse XPathAPI.
Damit kannst du Knoten mittels XPath auswählen.

Um etwas über XPath zu erfahren gibt es ein gutes Tutorial auf www.w3schools.com/xpath

Ach so, wenn du einen XML-Parser brauchst ... wie wäre es mit http://xml.apache.org/xerces2-j


----------



## shiRiaRu (23. Jan 2004)

Vielen Danke René 

Ich habe mich jetzt mal intensiver mit xpath beschäftigt. Dummerweise hatte ich bis 
vor 2 Wochen keine ahnung das es sowas wie Xpath gibt, da XML Newbie. 
Ist echt eine tolle Sache. Ich kann jetzt Elemente bequemer suchen. 
Allerdings muss ich mir noch etwas zu dem  Fallbeispiel: 

"XML Dokument mit absolut gleichen Knoten überlegen". 

(Das aber für spätere Funktionen wie: XML teile zusammenfügen/Importieren usw).


mfg 

shiRiaRu


----------

