# Probleme beim Erstellen einer XML



## hdi (18. Aug 2010)

Hi,

also ich nutze die XML-Klassen die mit dem JDK kommen, d.h. DocumentBuilder, Document, Element usw  (ist das eig dieses DOM Zeug?)

Nun habe ich folgendes PRoblem:
Ich will eine Struktur erzeugen die so aussieht: (muss man jetzt nicht genau anschauen, ist nur exemplarisch)

[XML]<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.0"
    xmlns:xmi="http://www.omg.org/XMI" xmlnsrg.eclipse.epf.uma="http://www.eclipse.org/epf/uma/1.0.5/uma.ecore"
    xmlnsrg.eclipse.epf.uma.resourcemanager="http:///org/eclipse/epf/uma/resourcemanager.ecore"
    xmlns:epf="http://www.eclipse.org/epf" epf:version="1.5.0">
  <org.eclipse.epf.uma.resourcemanager:ResourceManager xmi:id="_WsghwKo4Ed-qZavwIxiEzA"
      guid="_WsghwKo4Ed-qZavwIxiEzA">
    <subManagers xmi:id="_SMBqEKpBEd-ERbKl4wZxfg" href="uma://_SLuvIKpBEd-ERbKl4wZxfg#_SMBqEKpBEd-ERbKl4wZxfg"/>
    <resourceDescriptors xmi:id="_SMCRIKpBEd-ERbKl4wZxfg" id="_SLuvIKpBEd-ERbKl4wZxfg"
        uri="new_plug-in/plugin.xmi"/>
  </org.eclipse.epf.uma.resourcemanager:ResourceManager>
  <org.eclipse.epf.uma:MethodLibrary xmi:id="_Wsc3Yao4Ed-qZavwIxiEzA" name="Library1"
      guid="_Wsc3Yao4Ed-qZavwIxiEzA">
    <methodPlugins xmi:id="_SLuvIKpBEd-ERbKl4wZxfg" href="uma://_SLuvIKpBEd-ERbKl4wZxfg#_SLuvIKpBEd-ERbKl4wZxfg"/>
  </org.eclipse.epf.uma:MethodLibrary>
</xmi:XMI>[/XML]

Ich scheitere schon an der zweiten Zeile:


```
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element root = doc.createElement("xmi:XMI");
root.setAttribute("xmi:version", "2.0");
```

Der Aufruf der setAttribute Methode gibt mir den Fehler:


> FEHLER:  'Der Namensbereich für Präfix 'xmi' wurde nicht deklariert.'



Ich kenn mich mit diesen ganzen Klassen null aus, benutze sie zum ersten mal. Ich hab keine Ahnung wie ich jetzt einen Namespace deklariere damit?!

PS: Ehrlich gesagt scheitere ich schon an der allerersten Zeile, im Moment schreib ich die ganz normal per FileWriter da rein, und hänge erst nachher das ran was mir der DocumentBuilder zusammenbaut :/

Danke für die Hilfe!!


----------



## Ebenius (18. Aug 2010)

Hm. Erstmal herausfinden was Namensräume in XML sind: XML Tutorial - Namespace

Und da Dein Dokument Namensräume benutzt, solltest Du auch Document.createElementNS(String, String) und Document.createAttributeNS(String, String) bzw. Element.setAttributeNS(String, String, String) verwenden.

Ebenius


----------



## hdi (18. Aug 2010)

Hey, dank dir - ich hab damit auch schon etwas rumgespielt gehabt, aber iwie check ich das nicht ganz.

Ich hab jetzt folgendes gemacht:


```
Element root = doc.createElementNS("xmi","XMI");
		root.setAttributeNS("xmi","version","2.0");
```

Herauskommen tut aber:


> <XMI xmlns:ns0="xmi" ns0:version="2.0" xmlns="xmi"/>



Was ich will ist:


> <xmi:XMI xmi:version="2.0"/>



Und zu der ersten Zeile, also das hier:


> <?xml version="1.0" encoding="UTF-8"?>


Wie kann ich sowas realisieren? Ist das dieses Document#createProcessingInstruciton? Wenn ja weiß ich auch hier nicht so recht wie ich das machen soll, hab das noch nicht so hinbekommen.

Danke für die Hilfe!


----------



## sylo (18. Aug 2010)

Hi



> Und zu der ersten Zeile, also das hier:
> 
> 
> 
> ...



Wenn du eine komplett neue xml datei erstellen möchtest, dann könntest du die erste Zeile einfach mit einem FileWriter reinschreiben.

Grüße
sylo


----------



## hdi (18. Aug 2010)

@sylo
ja so mache ich es ja im moment. ist aber nicht allzu schön.
Das ist aber noch akzeptabel, ist ja nur eine Zeile.

Aber das mit den Namespaces muss ich hinkriegen, weil solange ich das nicht kann muss ich die _gesamte _XML per FileWriter schreiben. Das ist natürlich absolut umständlich und sinnlos.


----------



## Ebenius (19. Aug 2010)

hdi, wenn Du mal fix auf den ersten Link (das Tutorial) geklickt, die Seite durchgelesen und danach Dein Eingangs-XML angesehen hättest, hättest Du wahrscheinlich heraus gefunden, dass der Namespace "http://www.omg.org/XMI" heißt und der Namespace-Prefix "xmi" diesem Namespace zugewiesen wird. Das erste Argument der [c]xyzNS(…, …)[/c]-Methoden ist immer der Namespace und nicht der Prefix.

Ebenius


----------



## hdi (16. Sep 2010)

Hey,

muss ich mal wieder rauskramen da ich bisher nicht dazu gekommen bin.
Also ich hab mir das Tutorial durchgelesen. Aber in meinem Fall sieht das ein bisschen komplzierter aus:



> <?xml version="1.0" encoding="UTF-8"?>
> <xmi:XMI xmi:version="2.0"
> xmlns:xmi="http://www.omg.org/XMI" xmlnsrg.eclipse.epf.uma="http://www.eclipse.org/epf/uma/1.0.5/uma.ecore" xmlnsrg.eclipse.epf.uma.resourcemanager="http:///org/eclipse/epf/uma/resourcemanager.ecore" xmlns:epf="http://www.eclipse.org/epf" epf:version="1.5.0">



Also grundsätzlich müsste ich diese Namespaces jetzt so anlegen oder:

```
doc.createElementNS("http://www.omg.org/XMI","xmi");
	 doc.createElementNS("http://www.eclipse.org/epf/uma/1.0.5/uma.ecore", "org.eclipse.epf.uma");
	 doc.createElementNS("http:///org/eclipse/epf/uma/resourcemanager.ecore","org.eclipse.epf.uma.resourcemanager");
	 doc.createElementNS("http://www.eclipse.org/epf", "epf");
```

Die Frage ist was mach ich jetzt zur Root, und wie hänge ich quasi mehrere solcher Definitionen aneinander? Im obigen Code ist das ja irgendwie alles in einem Schritt gemacht, und irgendwie verwenden die da das "xmi" bevor sie es erstmal als Namespace deklarieren?
Also das XML oben kann ich jetzt schon ganz gut verstehen, ich sehe was NS-Deklarationen sind und was halt Attribute sind, aber wie generier ich das jetzt mit DOM?

Und die erste Zeile mit dem <?xml versteh ich noch immer nicht, mit was für einer Methode erzeugt man denn sowas in DOM?

Danke!


----------



## Noctarius (16. Sep 2010)

Zum Grund-Namespace würde ich den NS machen den du am meisten brauchst. Aber was meinst du mit "hintereinander hängen"?

Den XML-Header musst du nicht selbst anlegen, der sollte automatisch mitgespeichert werden, da dieser das XML Encoding angibt.


----------

