# Leerzeichen und anderes im XML Namen



## matzze2000 (12. Nov 2008)

Hallo, ich habe das Problem, dass ich unter anderem Leerzeichen in einem XML Namen habe und JDOM den Fehler bringt, dass ein XML-Name keine Leerzeichen enthalten darf und auch nicht mit einem Fragezeichen beginnen darf. Allerdings hab ich keine Ahnung wie ich das sonst machen soll. Ich wollte folgende einfache XML Datei testweise erzeugen:



> <?xml version="1.0" encoding="UTF-8"?>
> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
> <fo:layout-master-set>
> <fo:simple-page-master master-name="HelloWorld">
> ...



Und dafür habe ich folgenden Code verwendet:


```
//build basic xml structure
		template.addContent(new Element("?xml version=\"1.0\" encoding=\"UTF-8\"?"));
		Element root = new Element("root xmlns:fo=\'http://www.w3.org/1999/XSL/Format\'", "fo");
		template.setRootElement(root);
		
		Element layoutMasterSet = new Element("layout-master-set", "fo");
		root.addContent(layoutMasterSet);
		Element standardPageMaster = new Element("simple-page-master master-name=\"Standard\"", "fo");
		layoutMasterSet.addContent(standardPageMaster);
		standardPageMaster.addContent(new Element("region-body", "fo"));
		Element pageSequence = new Element("page-sequence master-reference=\"Standard\"", "fo");
		root.addContent(pageSequence);
		Element flow = new Element("flow flow-name=\"xsl-region-body\"", "fo");
		pageSequence.addContent(flow);
		Element block = new Element("block", "fo");
		flow.addContent(block);
		block.setText("Hallo Welt");
		
		XMLOutputter out = new XMLOutputter(); 
		try {
			out.output( template, System.out );
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
```

Die Leerzeichen sollen ja nun anscheinend so drin sein, aber implementiere ich das dann so im Code? Hoffe mir kann jemand helfen, danke schonmal für die Mühe


----------



## Murray (12. Nov 2008)

Im Element-Konstruktur darf nur der Element-Name stehen und keine Attribute. Und die erste Zeile der XML-Datei ist kein Element, sondern eine Processing-Instruction (und wird normalerweise bei der Ausgabe der XML-Datei vom Outputter automatisch ergänzt)


----------



## Murray (12. Nov 2008)

So könnte das in etwa aussehen:


```
//--- DOM aufbauen
		Document doc = new Document();
		Namespace fo = Namespace.getNamespace( "fo", "http://www.w3.org/1999/XSL/Format");
		Element root = new Element( "root", fo);
		doc.addContent( root);

		Element layoutMasterSet = new Element( "layout-master-set", fo);
		root.addContent( layoutMasterSet);

		Element simplePageMaster = new Element( "simple-page-master", fo);
		layoutMasterSet.addContent( simplePageMaster);
		simplePageMaster.setAttribute( "master-name", "HelloWorld");
		simplePageMaster.addContent( new Element( "region-body", fo));

		Element pageSequence = new Element( "page-sequence", fo);
		root.addContent( pageSequence);
		simplePageMaster.setAttribute( "master-reference", "HelloWorld");
		Element flow = new Element( "flow", fo);
		pageSequence.addContent( flow);
		flow.setAttribute( "flow-name", "xsl-region-body");
		Element block = new Element( "block", fo);
		block.setText( "HelloWorld");
		flow.addContent( block);
		
		//--- DOM ausgeben
		XMLOutputter outputter = new XMLOutputter();
		Format format = Format.getPrettyFormat();
		format.setExpandEmptyElements( false);
		outputter.setFormat(format);
		outputter.output(doc, System.out);
```


----------



## matzze2000 (12. Nov 2008)

Ahh, ok danke erstmal... Jetz habe ich nur noch das Problem, dass ich irgendwie aus dem Eintrag in der API Doku zu der Klasse Namespace nich schlau werde, denn zu den Konstruktoren steht da irgendwie nix.

Wenn ich mal von dieser Zeile ausgehe:



> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">



Dann ist also "fo" der Namensraum und "root" der Name. Der Rest ist das Attribut. Das wollte ich jetzt hinzufügen, bin mir allerdings nicht sicher, ob "xmlns" jetzt auch noch mal ein Namespace ist.

Habe diese Funktion benutzt:


```
root.setAttribute("fo", "http://www.w3.org/1999/XSL/Format", ?new Namespace()?);
```

Eclipse bietet mir als Konstruktor für Namespace einen mit 2 Strings an, aber keine Ahnung was da noch mit übergeben werden soll :-\ Oder bin ich da jetz total auf dem falschen Weg?


----------



## Murray (12. Nov 2008)

matzze2000 hat gesagt.:
			
		

> Dann ist also "fo" der Namensraum und "root" der Name.


Stimmt.


			
				matzze2000 hat gesagt.:
			
		

> Der Rest ist das Attribut. Das wollte ich jetzt hinzufügen, bin mir allerdings nicht sicher, ob "xmlns" jetzt auch noch mal ein Namespace ist.


Grundsätzlich ist das auch ein Attribut, und "xmlns" ist durchaus ein Namespace, aber: JDOM sorgt selbst dafür, dass dieses Attribut korrekt geschrieben wird, wenn das Element mit einem Namespace-Objekt versehen worden ist.

Wenn Du das Beispiel ausprobierst, siehst Du das.


----------



## matzze2000 (12. Nov 2008)

Ok, also ist es ok wenn ich schreibe:


```
root.setAttribute("fo", "xmlns:\"http://www.w3.org/1999/XSL/Format\"");
```

Allerdings habe ich noch ein Problem von dem ich keine Ahnung habe warum das so ist. Ich bekomme immer eine NullPointerException in der Zeile in der ich das root-Element hinzufügen will:


```
Element root = new Element("root", "fo");
root.setAttribute("fo", "xmlns:\"http://www.w3.org/1999/XSL/Format\"");
template.setRootElement(root);
```

Also eigentlich sollte das doch so gehen, oder fehlt da noch irgendwas?


----------



## Murray (12. Nov 2008)

matzze2000 hat gesagt.:
			
		

> Ok, also ist es ok wenn ich schreibe:
> 
> 
> ```
> ...



Nein, ist es nicht. Damit würde das Root-Element ein Attribut namens fo bekommen, welches den Wert xmlns:"http://www.w3.org/1999/XSL/Format" hätte (wobei die Anführungszeichen im Wert allerdings bei der Serialisierung ersetzt werden würden).

Also etwa so:

```
<root fo="xmlns:&quot;http://www.w3.org/1999/XSL/Format&quot;"
</root>
```


----------



## Murray (12. Nov 2008)

matzze2000 hat gesagt.:
			
		

> Ich bekomme immer eine NullPointerException in der Zeile in der ich das root-Element hinzufügen will:
> 
> 
> ```
> ...



Wird template denn irgendwo initialisiert?


----------



## matzze2000 (12. Nov 2008)

Das Template wurde natürlich noch nicht initialisiert ^^ Da hätte ich auch gleich drauf kommen können, hatte ne Testfunktion geschrieben und in der die Variable noch nich initialisiert...

Ich habe jetzt folgende Ausgabe:



> <?xml version="1.0" encoding="UTF-8"?>
> <root xmlns="fo" fo="http://www.w3.org/1999/XSL/Format">
> <layout-master-set>
> <simple-page-master master-name="Standard">
> ...



Bin jetzt zwar nicht ganz fit in xml aber auf den ersten Blick sollte das doch äquivalent zu dem sein was es eigentlich sein sollte, oder? Jedenfalls danke für die Hilfe!


----------



## Murray (12. Nov 2008)

Bis auf den Namespace: der fehlt nämlich; dafür gibt die beiden eher sinnfreien Attribute xmlns und fo am Root-Element.

Also nochmal: sieh Dir mein Beispiel an, dort funktioniert es.


----------



## matzze2000 (12. Nov 2008)

Ohh man, ich glaube ich sollte mal ne Pause machen... Habe dein Beispiel oben erst jetzt gesehn. Hatte deinen ersten Beitrag gelesen, daraufhin was ausprobiert und geantwortet und nicht gesehen, dass du gleich noch nen Beitrag geschrieben hast. Jetzt funktioniert alles wirklich so wie es soll... Großes Danke nochmal!


----------

