Discussion:
JDOM: Element aus Document extrahieren und neues Document erzeugen
(zu alt für eine Antwort)
Manuel Neuner
2006-07-19 11:31:49 UTC
Permalink
Hi,

wie kann man einen Teil eines JDOM-Documents extrahieren und damit ein
neues Document erzeugen?

Im Konkreten habe ich ein XML-Dokument, das ich in eine SOAP-Nachricht
umwandeln möchte. Das funktioniert wie folgt:

private Document create(Document doc)
{
Element requestElement = doc.detachRootElement();

Element envelope = new Element("Envelope", env);
Element body = new Element("Body", env);

body.addContent(requestElement);
envelope.addContent(body);

return new Document(envelope);
}

Nun möchte ich die Antwort-SOAP-Nachricht gerne wieder in ein
gewöhnliches XML- bzw. JDOM-Document zurückwandeln. Hierzu löse ich die
Verbindung des Root-Elements und lasse mir das erste Body-Element
zurückgeben. Mit diesem möchte ich ein neues JDOM-Document erzeugen:

private Document extract(Document doc)
{
Element envelope = doc.detachRootElement();
Element body = envelope.getChild("Body", env);

List list = body.getChildren();
Iterator iterator = list.iterator();
Element response = (Element) iterator.next();

return new Document(response);
}

Hier erhalte ich jedoch folgende Fehlermeldung:
org.jdom.IllegalAddException: The Content already has an existing parent
"soap:Body"

Wie funktioniert das richtig?

TIA,
Manuel.
Manuel Neuner
2006-07-19 12:37:55 UTC
Permalink
Post by Manuel Neuner
wie kann man einen Teil eines JDOM-Documents extrahieren und damit ein
neues Document erzeugen?
[...]
Post by Manuel Neuner
private Document extract(Document doc)
{
Element envelope = doc.detachRootElement();
Element body = envelope.getChild("Body", env);
List list = body.getChildren();
Iterator iterator = list.iterator();
Element response = (Element) iterator.next();
return new Document(response);
}
org.jdom.IllegalAddException: The Content already has an existing parent
"soap:Body"
Nach einigem Rumprobieren funktioniert es nun:

private Document extract(Document doc)
{
Element envelope = doc.getRootElement();
Element body = envelope.getChild("Body", env);

List list = body.getChildren();
Iterator iterator = list.iterator();
Element response = (Element) iterator.next();

return new Document((Element) response.detach());
}

Falls jemand eine elegantere Lösung als die mit dem Iterator hat, bitte
melden!
Stephan Müller
2006-07-19 13:18:10 UTC
Permalink
Manuel Neuner wrote:
[..]
Post by Manuel Neuner
List list = body.getChildren();
Iterator iterator = list.iterator();
Element response = (Element) iterator.next();
[..]
Post by Manuel Neuner
Falls jemand eine elegantere Lösung als die mit dem Iterator hat, bitte
melden!
Wenn du das erste Child-Element haben willst kannst du dieses auch
direkt über den Index aus der Children-Liste holen:

Element response = (Element) body.getChildren().get(0);

Alternativ geht natürlich auch der Weg über Element#getChild(...),
vorausgesetzt du kennst den Namen und den Namespace.


HTH,
Stephan.
Manuel Neuner
2006-07-20 08:30:37 UTC
Permalink
Post by Stephan Müller
[..]
Post by Manuel Neuner
List list = body.getChildren();
Iterator iterator = list.iterator();
Element response = (Element) iterator.next();
[..]
Post by Manuel Neuner
Falls jemand eine elegantere Lösung als die mit dem Iterator hat, bitte
melden!
Wenn du das erste Child-Element haben willst kannst du dieses auch
Element response = (Element) body.getChildren().get(0);
Danke, das ist ideal!
Post by Stephan Müller
Alternativ geht natürlich auch der Weg über Element#getChild(...),
vorausgesetzt du kennst den Namen und den Namespace.
Der Name ist variabel. Ich weiß nur, dass es das erste und einzige Child
von Body ist.

Nochmals danke,
Manuel.

Loading...