# Elemente mit Prefix via JDOM erstellen



## marvin (15. Sep 2005)

Hi,

hab ein kleines Problem, und zwar will ich mit Java folgende XML-Struktur in ein bereits bestehendes XML-FIle einfuegen:


```
<xinclude:include href="irgendwas.xml" />
```

Mein Problem ist es, wie ich das Prefix xinclude mit reinbekomm. Also ich koennte ohne Probleme


```
<include href="irgendwas.xml" />
```

erstellen.

Habe auch schon folgendes probiert:


```
Namespace xincludeNamespace = Namespace.getNamespace("xinclude", "http://www.w3.org/2001/XInclude");
	Element myElement = new Element("include", xincludeNamespace);
	myElement.setAttribute( new Attribute("href", "irgendwas.xml"));
	multiroot.addContent(myElement);
```

Allerdings erzeugt er mir dann:


```
<xinclude:include xmlns:xinclude="http://www.w3.org/2001/XInclude" href="irgendwas.xml" />
```

und das: xmlns:xinclude="http://www.w3.org/2001/XInclude" stoert da gewaltig. Gibt es eine Moeglichkeit das ganze ohne den stoerenden Teil hinzubekommen oder vielleicht auch en ganz anderer Ansatz?

Waere fuer hilfe sehr dankbar.


----------



## Bleiglanz (15. Sep 2005)

wieso stört das? es muss ja da sein, weil sonst der namespace gar nicht bekannt ist, der prefix ist ja nur eine Abkürzung


----------



## marvin (15. Sep 2005)

ja aber der namespace ist doch oben im dokument bereits definiert:

hier mal ein groesserer Ausschnitt:


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document SYSTEM "../sys/m.dtd">
<document xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">

<xinclude:include href="irgendwas1.xml" /> 
<xinclude:include href="irgendwas2.xml" /> 
<xinclude:include href="irgendwas3.xml" /> 
<xinclude:include href="irgendwas4.xml" /> 

</document>
```

nachdem ich dieses XML-Dokument erstellt hab fuehrt mein Java-prog noch eine xslt transformation durch und die schlaegt fehl wenn das Dokument stattdessen so aussieht:


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document SYSTEM "../sys/m.dtd">
<document xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">

<xinclude:include xmlns:xinclude="http://www.w3.org/1999/XML/xinclude"  href="irgendwas1.xml" /> 
<xinclude:include xmlns:xinclude="http://www.w3.org/1999/XML/xinclude"  href="irgendwas2.xml" /> 
<xinclude:include xmlns:xinclude="http://www.w3.org/1999/XML/xinclude"  href="irgendwas3.xml" /> 
<xinclude:include xmlns:xinclude="http://www.w3.org/1999/XML/xinclude"  href="irgendwas4.xml" /> 

</document>
```

Hab das xmlns... schonmal manuell vor der XSLT-Transformation rausgeloescht, dann gehts.


----------



## Bleiglanz (15. Sep 2005)

```
Document doc = new Document();
   Namespace xincludeNamespace = Namespace.getNamespace("xinclude", "http://www.w3.org/2001/XInclude");

   Element multiroot = new Element("multiroot"); 
   multiroot.addNamespaceDeclaration(xincludeNamespace);
   doc.setRootElement(multiroot);

// hier kommts: den gleichen Namespace wieder verwenden
   Element myElement = new Element("include", xincludeNamespace);
```


----------



## marvin (17. Sep 2005)

HI und erstma Danke fuer deine Muehe,alerdings funkioniert es bei mir leider immer noch nicht. Ich bekomme folgende Fehlermeldung:


org.jdom.IllegalAddException: The namespace xmlns:xinclude="http://www.w3.org/20
01/XInclude" could not be added as a namespace to "document": The namespace pref
ix "xinclude" collides with an additional namespace declared by the element

Hier ist mein Code:

Es wird erst der Konstruktor aufgerufen, und direkt danach die methode pdfManipulation. Das bedeutet ich benutz ein bereits bestehende xml Dokument und schreib in das multiroot,das ich auslese den neuen Namensraum und versuche das gesetze Praefix dann fuer die einzelnen Elemente zu uebernehmen. Das ganze wird x-mal aufgerufen. Jedes mal wird ein neues Element hinzugefuegt.


```
//Konstruktor
public XMLParser(File aFile)  {

   File file = aFile;

   if (file.exists()) {

	  try {
		   saxBuilder = new SAXBuilder(false);           //validierend
		   document = saxBuilder.build(file);
		   docType = document.getDocType();
                                    //auslesen des root elements
		   multiroot = document.getRootElement();

	  } catch (JDOMException ex)  {
		  success = false;
		  ex.printStackTrace();
		  failureMessage = ex.getMessage();

	  } catch (Exception ex) {
		  success = false;
		  failureMessage = ex.getMessage();
	  }

   } else {
		 success = false;
		 failureMessage = "Datei "+ file.getAbsolutePath() + " nicht gefunden";
		 
		 System.out.println(failureMessage);
   }

}



public void pdfManipulation(int zaehler, String xmlFile){
	
//der zaehler gib die anzahl der durchlaufe an
	int myZaehler = zaehler;
	String href = xmlFile;

Namespace xincludeNamespace = Namespace.getNamespace("xinclude", "http://www.w3.org/2001/XInclude");


// nur beim ersten Element wird der Namensraum im multiroot geaddet.(habs auch probiert dass er immer 
// gesetst wird,gabden selben fehler

if (myZaehler==1){
    multiroot.removeChildren();
    multiroot.addNamespaceDeclaration(xincludeNamespace);
}

Element myElement = new Element("include", xincludeNamespace);
myElement.setAttribute( new Attribute("href", ".." + File.separator + href));
multiroot.addContent(myElement);



File outFile = new File( Parameter.getInstance().getParameter("baseDir") + File.separator + "tmp" + File.separator + "inc.xml");
	
	try {

		FileOutputStream outStream = new FileOutputStream( outFile );
		XMLOutputter out = new XMLOutputter();
		out.output( document, outStream );

	} catch ( java.io.IOException ex) {
		ex.printStackTrace();
	}
}
```


Die xml die ich als input benutze sieht ganz einfach so aus:


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document SYSTEM "../sys/m.dtd">
<document> 
</document>
```

Waere super wenn du noch ne Idee haettest.


----------



## Bleiglanz (17. Sep 2005)

schreib mal die Zeile

```
Namespace xincludeNamespace = Namespace.getNamespace("xinclude", "http://www.w3.org/2001/XInclude");
```
ausserhalb (!) der Methode

```
public void pdfManipulation(int zaehler, String xmlFile){
```

sonst holst du ja bei jedem Durchgang doch wieder eine neue Instanz von der Factory


----------



## marvin (17. Sep 2005)

hab die zeile aus der methode rausgenommen, bekomm aber leider noch den selben fehler.

hab dann mal zum spass auch die zeile rausgenommen(also ganz rausgeloescht):


```
multiroot.addNamespaceDeclaration(xincludeNamespace);
```

er schreibt mir allerdings trotzdem in meine xml ins multiroot (document) den namespace:


```
<document xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">
```


----------

