# zwei xml files kombinieren



## copper (9. Sep 2005)

hallo ich möchte aus 2 xml files eins machen

1. file z. B. 

```
<layout>
  <page>
    <geometrie/>
    <label>
      <value>text</value>
    </label>
  </page>
</layout>
```

2. file z.B.

```
<layout>
  <page>
     <geometrie/>
     <component>
       <value>pfad</value>
     </component>
   </page>
</layout>
```
Endprodukt sollte so aussehen


```
<layout>
  <page>
    <geometrie/>
    <label>
      <value>text</value>
    </label>

    <component>                     //eingefügteer Quelltext
       <value>pfad</value>
    </component>

  </page>
</layout>
```

Wobei in den Orginal Files die Anzahl der Component Tags viel größer.
Quasi Teile aus File 2 in File1 kopieren.

Wie kann ich teile eines XML Files in ein anderes einfügen? 
Gibt es einen weg z.B. über jdom.org.document? Wie wäre dann der Weg? Die Api ist in dem Fall wenig aufschlussreich für mich.

Oder muss ich die Dateien z.b. mit einem Fileinputstream einlesen und Zeilen setzen?
Wie wäre dann der Weg? 

Thx für die Antworten


----------



## byte (9. Sep 2005)

das geht mit jdom doch recht einfach. erstmal liest du beide xml files als jdom document ein. dann gehst du in beiden documents an die richtige stelle, in deinem fall <page>. in der datei, wo du einfügen willst, kannst du dann einfach mit getChildren().add() elements aus der anderen datei einfügen.

noch fragen?


----------



## copper (10. Sep 2005)

thx für die schnelle antwort

ja es funktioniert noch net so ganz hier mal mein Quelltext:

```
in = new FileInputStream("c:/tomtest/vorlagen/pages/102.jdl");
doc = builder.build(in);

list = doc.getRootElement().getChild("page").getChildren("component");
                
in = new FileInputStream("c:/tomtest/Verlinkung 3 Themen/pages/100.jdl");
docout = builder.build(in);
docout.getRootElement().getChild("page").addContent(listTemplVorl);
                
file = new File("c:/test.xml");
out = new FileOutputStream(file); 
serializer.output(docout, out); 
                
out.flush(); 
out.close();
```

ich bekomme eine Exception: 
org.jdom.IlligalAddException: The Content already has an existing parant "page"

ich nehme an das ist auf den Content bezogen, den ich kopiere, also "component"


----------



## byte (10. Sep 2005)

bevor du die elemente adden kannst, musst du sie aus dem alten document removen, weil sie sonst immernoch auf den alten parent zeigen.


----------



## TRunKX (12. Sep 2005)

```
/**
   * Diese Methode macht aus einer gegebenen XML Datei und werten aus einer Hastabelle sowie
   * einer Knotenpunktüberschrifft eine große XML in der die neuen Werte unter dem übergebenen
   * Knotenpunkt gesammelt sind!
   *
   * @param file1 Absoluter Pfad der XML in der am Ende alle Daten liegen sollen
   * @param table1 Die Hashtable mit den Informationen die in den neuen Knotenpunkt sollen
   * @param knotenname Der Name des Knotens unter dem die Infos der Hashtable gespeichert werden
   */
  public void schreibeXML(String file1, Hashtable table1, String knotenname)
  {
		// benötigte Variablen
    String gelesen;
    String fertig = "";
    String textfile2 = "";

    try
    {
		//XML öffnen und bis zu dem Punkt auslesen wo das neue eingefügt werden soll
      InputStreamReader input = new InputStreamReader(new FileInputStream(file1));
      BufferedReader br = new BufferedReader(input);
    //Die Hash Table sortieren
      Iterator keys = table1.keySet().iterator();
      Iterator values = table1.values().iterator();

      //Schleife die den Inhalt der Hashtable in die Vartiable xml Style schreibt
      while(keys.hasNext() && values.hasNext())
      {
      	// kleiner Teil der das ganze nach XML aussehen lässt
        gelesen = "  <" + keys.next().toString() + " value=\""
          + values.next().toString() + "\"/>\n";
        textfile2 = textfile2 + "\n" + gelesen;
        gelesen = "";
      }

      gelesen = "";

      while(true)
      {
      	//auslesen der dAtei
        gelesen = br.readLine();
				//am Ende wird das neue eingefügt und das end manuell neu geschrieben!
        if((gelesen != null) & gelesen.endsWith("</xml>"))
        {
          fertig = fertig + "\n" + "<" + knotenname + ">" + textfile2 + "\n"
            + "</" + knotenname + ">" + "\n" + gelesen;

          break;
        }
        //Abbruch am ende der Datei eigentlich unnötig nur falls es mal keine XML sein sollte
        else if(gelesen == null)
        {

          break;
        }
        else
        {
          fertig = fertig + "\n" + gelesen;
        }

        if(gelesen == null)
        {

          break;
        }

        gelesen = "";
      }

      br.close();
    }
    catch(IOException e)
    {
      System.out.println(e);
    }

    BufferedReader brin = new BufferedReader(new InputStreamReader(System.in));

    try
    {
    	//die alte conf wird gelöscht!
			File dir = new File(file1);
			dir.delete();
			//und in die neue wird der alte + neue Inhalt geschrieben
      PrintWriter pwoutD = new PrintWriter(new BufferedWriter(
            new OutputStreamWriter(
              new FileOutputStream(file1, true))));
      StringTokenizer st = new StringTokenizer(fertig, "\n");

      while(st.hasMoreTokens())
      {
        pwoutD.println(st.nextToken());
      }
			//Datei wird geschlossen
      pwoutD.close();
    }

    catch(IOException e)
    {
      System.out.println(e);
    }
  }
```


Ich denke mal das das alles ist was du brauchst... + eine Methode die File 2 öffnet und alle Sätze die du willst in die Has Table legt. den Namen des Knotenpunktes kannste übergeben oder auslesen .... hörte sich lustig an da habe ich es programmiert!


----------



## copper (12. Sep 2005)

Ja danke für eure Antworten natürlich funzt beides 
Ich habe jetzt folgendes gemacht:




```
in = new FileInputStream("c:/file1.xml"); 
doc = builder.build(in); 

in = new FileInputStream("c:/file2.xml"); 
docout = builder.build(in); 

list = doc.getRootElement().getChild("page").getChildren("component"); 
Element element = list.get(0);//für den Fall das nur ein Child übertragen werden soll ansonsten muss mit einer         
                                               Schleife gearbeitet werden
doc.getRootElement().getChild("page").removeContent(element);
docout.getRootElement().getChild("page").addContent(element);
                
file = new File("c:/fertigesfile.xml"); 
out = new FileOutputStream(file); 
serializer.output(docout, out); 
                
out.flush(); 
out.close();
```


----------



## copper (12. Sep 2005)

ach so hat sich lustig angehört   
sowas macht man wohl net alle tage, 2 files kombineren, was

Für alle die mal ein ähnliches Prob haben: hier haben wir 2 unterschiedliche Lösungsansätze, die beide zum gleichen Ergebniss führen.

cu


----------

