# Doctype in DOM nutzen



## kekskennzeichen (10. Mrz 2010)

Hallo zusammen,

ich hab die schöne Aufgabe ein DIV von zwei verschiedenen Versionen eines XML Dokuments zu machen.  Ich habe jedoch das Problem das die beiden originale jeweils einen DocType sowie ein paar Entities definieren. 

Dies hier steht direkt im Dokument:

```
<!DOCTYPE Document SYSTEM "Document.dtd" [
  <!ENTITY datum "23/02/2010">
  <!ENTITY kunde ".....">
  <!ENTITY firmakunde "....">
  <!ENTITY projekt "....">]>
```

Ich nutze das w3c.DOM aus Java1.6 . Dies gibt mir lediglich den DocType zurück, wenn ich jedoch das Dokument in eine Datei schreiben will, fehlt dann jedesmal oben genannte Zeilen. Zum schreiben nutze ich foldens Stück Code:


```
private void writeDiv(final Document doc) {
		final String name = file1.getName();
		final String filename = name.replace(".xml", "") + "_div.xml";

		try { // Prepare the DOM document for writing 
			final Source source = new DOMSource(doc);
			// Prepare the output file 
			final File file = new File(filename);
			final Result result = new StreamResult(file);
			// Write the DOM document to the file 
			final Transformer xformer = TransformerFactory.newInstance()
					.newTransformer();
			xformer.transform(source, result);
		}
		catch (final TransformerConfigurationException e) {
			e.printStackTrace();
		}
		catch (final TransformerException e) {
			e.printStackTrace();
		}
	}
```

Wie kann ich ihn beim schreiben dazu bringen den DocType sowie die Entities mit zu schreiben?

grüße
keks


----------



## Noctarius (10. Mrz 2010)

Emitting a DOCTYPE Declaration When Writing an XML File from a DOM Document | Example Depot Das müsste helfen, hab's aber nie versucht (da ich nur mit XML Schemata arbeite)


----------



## kekskennzeichen (10. Mrz 2010)

Ja der Link hat schonmal geholfen, ich hab das mal geändert auf folgendes:


```
private void writeDiv(final Document doc) {
		final String name = file1.getName();
		final String filename = name.replace(".xml", "") + "_div.xml";

		try { // Prepare the DOM document for writing 
			final Source source = new DOMSource(doc);
			// Prepare the output file 
			final File file = new File(filename);
			final Result result = new StreamResult(file);
			// Write the DOM document to the file 
			final Transformer xformer = TransformerFactory.newInstance()
					.newTransformer();

			final String docType = doc.getDoctype().getSystemId();
			final String entities = doc.getDoctype().getInternalSubset();

			xformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, docType);
			xformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS,
					entities);
			xformer.transform(source, result);
		}
		catch (final TransformerConfigurationException e) {
			e.printStackTrace();
		}
		catch (final TransformerException e) {
			e.printStackTrace();
		}
	}
```

Nun ist aber das Problem das er die 2te Zeile setOutputProperty net ausführt, jedenfalls landet kein CDATA_Section im Dokument?
Hat dazu wer eine Lösung?

greetz Keks


----------



## Noctarius (10. Mrz 2010)

Hast du die denn auch als CDATA Area im Xml-Dom eingebettet?


----------

