# JDOM Root-Element entfernen aber Rest behalten



## rapthor (8. Jan 2006)

Hallo,

ich habe mittels SOAP ein XML-Dokument folgenden Inhalts erhalten:


```
<?xml version="1.0" encoding="UTF-8"?>
<GetFileResponse>
  <example-queries>
    <query>
      <description>Simple fulltext query on Shakespeare plays</description>
      <code>for $speech in //SPEECH[LINE &= 'love']
return $speech</code>
    </query>
    <query>
      <description>Fulltext query using near</description>
      <code>for $speech in //SPEECH[SPEAKER &= 'witch' and near(., 'fenny snake')]
return $speech</code>
    </query>
  </example-queries>
</GetFileResponse>
```

Nun möchte ich jedoch das in der SOAP-Antwort standardmäßig enthaltene <...Response>-Knötchen entfernen, ohne dabei die darunter befindlichen Elemente anzufassen. Denn eigentlich enthält das eigentliche XML-Dokument, das ich per SOAP erfrage, ja garkeinen <..Response>-Root-Knoten. Sondern vielmehr (in diesem Fall) einen <example-queries>-Root-Knoten.

Hat da jemand eine Lösung?


----------



## clemson (8. Jan 2006)

erzeuge dir doch einfach ein neues Document

```
Element get_file_response = document.getRootElement();
Element example_queries = get_file_response.getChild("example-queries");
Document new_root = new Document( example_queries );
```


----------



## rapthor (8. Jan 2006)

Irgendwie will das nicht so richtig klappen. Der Knoten "example-queries" ist bei der Aktion leer und das Dokument somit nicht in Ordnung


----------



## clemson (8. Jan 2006)

wie leer? hast du das document richtig geparst?


----------



## rapthor (8. Jan 2006)

Ja, wie gesagt, eines der Beispiele habe ich ja oben angeführt.

Ich habe das jetzt anders gelöst. Ich entferne aus demnach String umgewandelten Dokument einfach den String mit dem Knotennamen, den ich nicht mehr brauche.


----------



## clemson (9. Jan 2006)

rapthor hat gesagt.:
			
		

> Ich entferne aus demnach String umgewandelten Dokument einfach den String mit dem Knotennamen, den ich nicht mehr brauche.



is halt nicht die schönste variante...

wenn ich zeit habe, werde ich das mal in jdom probieren - das müsste eigentlich lösbar sein...


----------



## clemson (9. Jan 2006)

```
/*
 * Created on Jan 9, 2006, 7:22:27 PM
 */
package org.test;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


/**
 * @author Müller Clemens
 */
public class Main {
	
	static XMLOutputter outputter = new XMLOutputter( Format.getPrettyFormat() );

	/**
	 * @param args
	 * @throws JDOMException
	 * @throws IOException
	 */
	public static void main( String[] args ) throws JDOMException, IOException {
		
		// Build the main file
		File source = new File("document.xml");
		SAXBuilder builder = new SAXBuilder(false);
		Document doc = builder.build( source );
		
		// get the root element
		Element root = doc.getRootElement();
		
		// get the element, which we want to be the new root
		Element example_queries = root.getChild("example-queries");
		
		// get the element as string
		String new_doc_str = outputter.outputString( example_queries );
		
		// build a new document out of the string
		Document new_doc = builder.build( new StringReader(new_doc_str)  );
		outputter.output( new_doc, System.out );
	}
}
```

so gehts...


----------



## rapthor (9. Jan 2006)

Hab es jetzt bei mir eingebaut und es funktioniert. Jedoch müsste man überlegen, ob dieses Verfahren bei größeren XML-Dokumenten nicht ziemlich aufwändig und dadurch langwierig wird. Weil man ja das gesamte Dokument nochmal neu aufbaut.

Danke Dir!


----------



## clemson (9. Jan 2006)

rapthor hat gesagt.:
			
		

> Jedoch müsste man überlegen, ob dieses Verfahren bei größeren XML-Dokumenten nicht ziemlich aufwändig und dadurch langwierig wird. Weil man ja das gesamte Dokument nochmal neu aufbaut.



ja, das stimmt. aber ich habs mit

```
Document new_doc = new Document(doc.getRootElement().getChild("example-queries"));
```
probiert, und da sagt er mir, dass bereits ein wurzelelement vorhanden ist...


----------



## clemson (9. Jan 2006)

soda, jetzt hab ich die lösung gefunden (detach war die zaubermethode)...


```
/*
 * Created on Jan 9, 2006, 7:22:27 PM
 */
package org.test;

import java.io.File;
import java.io.IOException;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


/**
 * @author Müller Clemens
 */
public class Main {
	
	static XMLOutputter outputter = new XMLOutputter( Format.getPrettyFormat() );

	/**
	 * @param args
	 * @throws JDOMException
	 * @throws IOException
	 */
	public static void main( String[] args ) throws JDOMException, IOException {
		
		// Build the main document
		File source = new File("document.xml");
		SAXBuilder builder = new SAXBuilder(false);
		Document doc = builder.build( source );
		
		// get the root element
		Element root = doc.getRootElement();
		
		// get the wanted element
		Element wanted_node = root.getChild("example-queries");
		
		// detach the element, so it can be set as a new root
		Element example_queries = (Element) wanted_node.detach();
		
		// build a new document
		Document new_doc = new Document( example_queries );	
		outputter.output( new_doc, System.out );
		
		// garbage collector ;-)
		root = null;
		wanted_node = null;
		example_queries = null;
	}
}
```


----------



## rapthor (10. Jan 2006)

Ja, nochmals danke. So scheint's die beste Lösung zu sein.


----------

