# neue XML-Datei erstellen mit vorhandener Struktur



## NO_Kind (24. Aug 2007)

Hallo zusammen! 


Ich will mit DOM ein neues XML-Dokument erstellen. jetzt will ich mir aber nicht die Arbeit machen jedes Element(Tags) selbst zu schreiben. 

ich hab ein bestehendes XML-Dokument. Jetzt will ich einfach die Struktur davon verwenden, jedoch soll der Inhalt nicht mit übernommen werden.

Gibt es eine Möglichkeit dies umzusetzen oder muss ich von Hand das XML-File generieren???


danke euch!


----------



## mikachu (24. Aug 2007)

mit "inhalt" meinst du die CDATA sektions und/oder die attribute?

also nur die elementnamen als neue tags in das neue xml reinschreiben ?!?


```
<foo attr="foobar">
    text text
    text text
    <bar anotherattribute="gazong" />
</foo>
```
wird zu

```
<foo>
    <bar />
</foo>
```
oder ?!?


----------



## Gast (24. Aug 2007)

Hey mika genau das meine ich!


----------



## mikachu (24. Aug 2007)

hab ich auch schonmal machen müssen, jedoch nicht mit JDOM.
muss das unbedingt jdom sein?!?


----------



## Gast (24. Aug 2007)

nein muss nicht sein. kann ganz normal mit den packages :

import javax.xml.*;
import org.w3c.*;

erfolgen.


----------



## Gast (24. Aug 2007)

Kann mir das hier weiterhelfen?


```
NodeList mainList = newDoc.getElementsByTagName("*");
```
???


----------



## Gast (24. Aug 2007)

```
for ( int i = 0; i < mainList.item(0).getChildNodes().getLength(); i++ )
        {
           Node node = mainList.item(0).getChildNodes().item(i);
           newDoc.adoptNode(node);
           
        }
```

und danach das hier.


----------



## mikachu (24. Aug 2007)

wie sieht dein bestehendes xml dokument aus? ist das ne datei, nen stream oder sonst was? oder ist das auch schon nen jdom?


----------



## Gast (24. Aug 2007)

es ist eine xml datei

der source oben funzt nicht.


----------



## Gast (24. Aug 2007)

ich würd mich nicht so am DOM festbeißen....


----------



## mikachu (24. Aug 2007)

so, ich hab hier mal was gebastelt 

```
import java.io.IOException;
import java.io.OutputStream;

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

public class XMLHandler extends DefaultHandler
{
   private OutputStream _writeTo;
   private final String INDENT = "\t";
   private int _indentAmount = -1;
   private String _encoding;

   public XMLHandler( final OutputStream os, String enc )
   {
      _writeTo = os;
      _encoding = enc;
   }

   public XMLHandler( final OutputStream os )
   {
      this( os, "UTF-8" );
   }

   @Override
   public void startElement( String uri, String localName, String qName, Attributes atts )
   {
      _indentAmount++;
      try
      {
         for( int i = 0; i < _indentAmount; ++i )
               _writeTo.write( INDENT.getBytes() );
         _writeTo.write( '<' );
         _writeTo.write( qName.getBytes() );
         _writeTo.write( '>' );
         _writeTo.write( '\n' );
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
   }

   @Override
   public void endElement( String uri, String localName, String qName )
   {
      try
      {
         for( int i = 0; i < _indentAmount; ++i )
               _writeTo.write( INDENT.getBytes() );
         _writeTo.write( '<' );
         _writeTo.write( '/' );
         _writeTo.write( qName.getBytes() );
         _writeTo.write( '>' );
         _writeTo.write( '\n' );
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
      _indentAmount--;
   }

    @Override
    public void startDocument()
    {
       try
      {
         _writeTo.write( ( "<?xml version=\"1.0\" encoding=\"" + _encoding + "\"?>" ).getBytes() );
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
    }
}
```

aufruf mittels:

```
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class Slimmer
{
   public static void slim( InputStream fatXML, final OutputStream slimXML )
   {
      try
      {
         SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

         parser.parse( fatXML, new XMLHandler( slimXML ) );
      }
      catch( ParserConfigurationException e )
      {
         e.printStackTrace();
      }
      catch( SAXException e )
      {
         e.printStackTrace();
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
   }

   public static void main( String[] args ) throws FileNotFoundException
   {
      FileOutputStream fos = new FileOutputStream( new File( "output.xml" ) ); // hier kannst du irgendeinen anderen stream nehmen
      InputStream in = new FileInputStream( new File( "test.xml" ) ); // test.xml ist deine xml-datei

      Slimmer.slim( in, fos );
   }
}
```

have phun


----------



## mikachu (24. Aug 2007)

ehrlich gesagt weiß ich jetzt im moment auch nicht im geringsten, wie das mit jdom zu bewerkstelligen ist... ich hab hier auf arbeit nur mit streams zu tun und mit größeren xml's


----------



## Gast (24. Aug 2007)

Hey Mika, 

vielen vielen dank für den Source! Genau das hab ich gesucht.



Sach mal bist am arbeiten oder daheim  

wenn auf Arbeit, dann respekt das du sie so einteilen kannst, das du nebenbei Zeit für unsere Problem hast.


----------



## Gast (24. Aug 2007)

Ich hab auch erstmal mit größeren XML-Dateien zu tun 

größe = > 10 mb


aber diese müssen dan runtergebrochen werden


----------



## mikachu (24. Aug 2007)

auf arbeit... aber hab meine tasks schon erledigt und mit chef geredet, der aber erst am nächsten montag zeit hat...
und man lernt, indem man programmiert, oder   

das einzige manko, was es noch zu beseitigen gibt, ist, wenn du folgende struktur hast

*<foo att="bar" />*

dass da ein

*<foo>
</foo>*

draus gemacht wird... aber da kannste dir ja allein noch en paar gedanken machen


----------



## mikachu (24. Aug 2007)

Gast hat gesagt.:
			
		

> Ich hab auch erstmal mit größeren XML-Dateien zu tun
> 
> größe = > 10 mb
> 
> ...



deswegen muss ich mit streams arbeiten... und die rocken mit der zeit


----------



## Gast (24. Aug 2007)

In dieser XML-Datei nutzen wir keine Attribute....


Ich werd erstmal deine Lösung übernehmen. Schau aber noch ob man es doch nciht mit Dom-lösen kann. 

find es nämlich immer blöd, erstmal dom zu verwenden, dann doch auf stream etc zu setzen. und am ende brauch ich doch wieder dom ,  ist halt bissel blöd.


----------



## mikachu (24. Aug 2007)

ok, wenn es aber die möglichkeit gibt, jdom als stream bereitzustellen...  ...was es bestimmt nicht gibt

aber wenn ihr ausschließlich DOM nutzt... dann macht das keinen sinn, dass iss wahr

es soll ja auch nur ne alternative lösung sein... wie in den FAQ steht... "wir machen keine hausaufgaben"


----------



## No_Kind (24. Aug 2007)

Alles klar Chef  wird so gemacht!


----------

