# JDom und XPath



## fisch (15. Sep 2005)

Hi

ich versuche grade mit XPath und Jdom eine Element zu löschen. XPath findet es zwar aber wie kann ich denn das Element zurück bekommen um es mit remove zu entfernen. Bis jetzt bekomm ich von XPath immer nur true zurück. Das Problem ist, das meine Elemente im Prinzip alle gleich heißen und sich nur in den Attributen unterscheiden:

Das XML Dokument:


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE style-decl SYSTEM ".\templates\style.dtd">
<style-decl>
  <font-decl key="kursiv" font-family="Arial" font-color="RGB {0, 0, 0}" font-size="10" underlined="0" italic="-1" style="2" />
  <font-decl key="ueberschrift" font-family="Arial" font-color="RGB {0, 0, 0}" font-size="14" underlined="1" italic="0" style="0" />
</style-decl>
```


Und mein Java Code dazu


```
XPath xStyle = XPath.newInstance("/style-decl/font-decl/@key=\""+id+"\"");
List liste = xStyle.selectNodes(styleDoc);
System.out.println(liste.toString());
			
			
styleRoot.removeChild(xStyle.selectSingleNode(styleDoc).toString())
outPutter.output(styleDoc,styleStream);
styleStream.close();
```


----------



## clemson (15. Sep 2005)

Hallo!

Was gibt dir denn System.out.println(liste.toString()); aus?


----------



## clemson (15. Sep 2005)

bzw. probier mal die Abfrage 
	
	
	
	





```
//style-decl/font-decl[@key='"+id+"']
```


----------



## fisch (15. Sep 2005)

Also wenn es so wie oben abgefragt wird dann bekomme ich

```
true
```
 als Ergebnis und wenn ich deine Abfrage benutze bzw. 
	
	
	
	





```
//font-decl[@key='"+id+"']
```
 dann bekomme ich 
	
	
	
	





```
[Element: <font-decl/>]
```

Noch eine Frage zwischen durch wie kann ich denn meinem Root-Element ein Namespace hinzufügen.


----------



## clemson (15. Sep 2005)

okay, dann musst du die zweite abfrage verwenden (ich glaube es hat an dem einfachen slash und bei dem 
	
	
	
	





```
font-decl/@key=\""+id+"\""
```
 bei der ersten abfrage gelegen).

Jedenfalls hast du jetzt das bestimmte Element abgefragt. Jetzt musst du dieses Element nur mehr noch casten und von deinem Dokument lösen...

also, so in etwa: 
	
	
	
	





```
XPath xStyle = XPath.newInstance("/style-decl/font-decl[@key='"+id+"']");
List liste = xStyle.selectNodes(styleDoc);
System.out.println(liste.toString());

Element font_decl = (Element) liste.get(0);
         
         
styleRoot.removeChild(font_decl)
outPutter.output(styleDoc,styleStream);
styleStream.close();
```


----------



## fisch (15. Sep 2005)

Hm versteh ich grade nicht ganz was meinst du mit " casten und von deinem Dokument lösen"
Kannst du mir das grad mal ein bißchen näher erklären bitte


----------



## clemson (15. Sep 2005)

fisch hat gesagt.:
			
		

> Noch eine Frage zwischen durch wie kann ich denn meinem Root-Element ein Namespace hinzufügen.



ich glaube du meinst das...


----------



## fisch (15. Sep 2005)

hä?? jetzt bin ich ganz verwirrt


----------



## fisch (15. Sep 2005)

ah okay doch net ganz verwirrt, danke für den namespace hinweis, allerdings hab ich das mit dem casten immer noch net verstanden (okay is grad mal 5 minuten her)


----------



## clemson (15. Sep 2005)

fisch hat gesagt.:
			
		

> Hm versteh ich grade nicht ganz was meinst du mit " casten und von deinem Dokument lösen"
> Kannst du mir das grad mal ein bißchen näher erklären bitte




nun ja. da wir ja wissen, dass die xpath abfrage, welche du an dem dokument ausgeführt hast, ein Ergebnis vom Typ Element zurückgibt (sieht man an der ausgabe bzw. kannst du dir mittels 
	
	
	
	





```
System.out.println( liste.get(0).getClass().toString() );
```
 ausgeben lassen), kannst du dieses Ergebnis beruhigt nach Element casten (umwandeln).


----------



## fisch (15. Sep 2005)

Steh wohl irgendwie auf dem Schlauch, versteh schon was du mir da erklärst, allerdings weiß ich immer noch nicht was mir das jetzt bei löschen bringt, da ich ja doch als angabe nur 
	
	
	
	





```
font-decl
```
 bekomme, ich aber nicht irgendein Element löschen will sondern das mit einem bestimmten Schlüssel (im key Attribut). Also ich mein aus diesem Dokument

```
<font-decl key="kursiv" fo:font-family="Arial" fo:font-color="RGB {0, 0, 0}" fo:font-size="12" underlined="0" italic="-1" fo:font-style="2" />
<font-decl key="regen" fo:font-family="Blackadder ITC" fo:font-color="RGB {0, 0, 0}" fo:font-size="14" underlined="0" italic="1" fo:font-style="3" />
```

will ich jetzt zum Beispiel das 2. Element löschen (das mit Regen).

Vielleicht versteh ich dich aber auch falsch und du hast mir schon die Antwort gegeben, aber dann sehe ich sie wohl gerade nicht  :bahnhof:


----------



## Bleiglanz (15. Sep 2005)

```
XPath xStyle = XPath.newInstance("/style-decl/font-decl[@key='kursiv']"); 
 
Object treffer = xStyle.selectSingleNode(doc);

if(treffer instanceof Element){
    ((Element) treffer).getParent().removeContent((Element)treffer);
}
```


----------



## fisch (15. Sep 2005)

Hei danke das funzt. Hast meinen Resttag gerettet


----------

