# XML mit Transformer transformieren



## hansi (25. Mrz 2009)

Hallo,

ich stehe vor der Aufgabe den Inhalt einer XML zu verarbeiten. Da die zu verarbeitende XML zu groß für einen DOM-Parser ist, möchte ich die XML mit einem Stax parsen. Für bestimme Elemente innerhalb der XML ist es erforderlich den Teilbaum als XML auszugeben. Im Beispiel soll Element B mit komplettem Inhalt als XML ausgegeben werden.

[HIGHLIGHT="xml"]
<ns1:A>
   <ns2:B>
      <ns3:C/>
      .....
      <ns3/>
   </ns2:B>
   ....
   <ns2:B/>
</ns1:A>[/HIGHLIGHT]

Mein Ansatz war, die XML mit einem Stax (StreamReader) zu parsen. "Trifft" der Parser auf das Element B, wird der Inhalt mit einer XSL-Transformation transformiert (siehe Java-Code). Die resultierende XML beginnt mit der XML-Deklaration, wobei diese für die Weiterverarbeitung des Teilbaumes etwas störend ist. Ich habe dann erfolglos durch das Setzen einer entsprechenden Property versucht, die XML-Deklaration zu unterdrücken.

[HIGHLIGHT="Java"]
StAXSource source = new StAXSource(...);
StreamResult result = new StreamResult(...);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutpuKeys.OMIT_XML_DECLARATION, "yes");
transformer(source, result);
[/HIGHLIGHT]

Kenn jemand eine Lösung für das Problem?

Viele Grüße
Hans


----------



## musiKk (26. Mrz 2009)

Ich kann dein Problem leider nicht nachvollziehen, bei mir wird mit dem entsprechenden Property keine XML-Deklaration mit ausgegeben.

Als Beispiel mal hier was. Ich bin extra auch den Umweg über StAX gegangen.

```
public static void main(String[] args) throws Exception {

	String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>bar</foo>";

	XMLInputFactory xif = XMLInputFactory.newInstance();
	XMLEventReader xer = xif.createXMLEventReader(new StringReader(xml));

	StAXSource staxSource = new StAXSource(xer);

	TransformerFactory tf = TransformerFactory.newInstance();
	Transformer t = tf.newTransformer();
	t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

	t.transform(staxSource, new StreamResult(System.out));

}
```

Resultat ist bei mir da

```
<foo>bar</foo>
```
Lasse ich das Property weg, erscheint

```
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
```


----------



## hansi (28. Mrz 2009)

Hi musikk,

danke für die Antwort. Habe bei meiner Anfrage allerdings ein paar Dinge durcheinander gebracht. Beim transformieren in einen StreamResult hatte ich das Problem, dass die Namespaces nicht korrekt angegeben wurden. Ich meine, dass die Namespace-Definition für die prefixes von ein paar Attributen nicht transformiert wurden.

Das Problem mit der XML-Deklaration hatte ich bei der Verwendeung von StaxResults. Das aus dem Original-XML heraustransformierte Stück XML soll bei der Weiterverarbeitung in ein anderes Stück XML eingefügt werden. Die XML-Deklaration ist hierbei im Weg. 

Viele Grüße
Hans


----------

