# Geändertes XML-File wieder abspeichern.



## Sneakizzel (27. Jul 2006)

Mahlzeit zusammen,

ich öffne eine bestehende XML-Datei, ersetze darin ein Tag und möchte dies wieder abspeichern, der Code sieht etwa wie folgt aus:


```
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(new File("layout.xml").toURL().toString());

ersetzeTag();	

speichereXMLFile();
```

Ich bräuchte also Hilfe bei der Methode _speichereXMLFile()_. Eigentlich gar nicht so schwer, doch min Problem liegt darin das ich dies mit Java 1.3.1_08 und JAXP 1.0.1 realisieren *muss*. Vielleicht hat einer von Euch eine Idee. Die API zu JAXP 1.0.1 könnt Ihr finden unter:
Link API JAXP 1.0.1

Ich sag schon mal Danke im Voraus
sneaker


----------



## foobar (27. Jul 2006)

Du mußt den Baum einfach einem Transformer übergeben:
http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/transform/Transformer.html#transform(javax.xml.transform.Source,%20javax.xml.transform.Result)

Ich weiß aber nicht ob es das in Java 1.3 auch schon gab, also einfach mal testen.


----------



## Sneakizzel (27. Jul 2006)

Das habe ich schon ausprobiert, ist (so wie ich das sehe) nicht in Java 1.3.1 und der entsprechenden JAXP Version enthalten. Trotzdem Danke
sneaker


----------



## foobar (27. Jul 2006)

Ja, stimmt.

Ich hab mir gerade mal die API angesehen, das sieht ja ziemlich mau aus.


----------



## muckelzwerg (27. Jul 2006)

Sowas ? :
http://www.oreilly.com/catalog/jenut2/chapter/ch19.html#AUTOID-14754
Laut Angabe wurde 1.0.1 verwendet, und die Funktionen sind soweit ich das sehen kann auch alle enthalten.
(sind ja nicht viele)

[gefunden über : 
http://www.google.de/search?q=jaxp+1.0.1+save+xml+document ]


  --  --  muckelzwerg


----------



## foobar (27. Jul 2006)

@muckelzwerg Hmm, das sieht aber gefährlich aus. Es muß doch auch irgendowie direkt über die API funktionieren.


----------



## Sneakizzel (27. Jul 2006)

Mhh, ich hatte schon befürchtet das es auf so etwas heraus laufen wird. Was mich nicht wirklich glücklich macht.

sneaker


----------



## muckelzwerg (27. Jul 2006)

Wieso "muss" das gehen ?
Egal was man sich ansieht, überall klingt durch, dass es eben nicht geht.
JAXP 1.1 hatte als neues Feature die Transformatoren.
http://www.deitel.com/books/xmlHTP1/xmlhtp1_faq.html#Chapter 8 examples

Mit fürheren Versionen gibt es noch die Möglichkeit die XMLDocument Klasse 
von Crimson zu verwenden.
http://www-nlp.stanford.edu/local/talks/sax-dom-tutorial/DOMExample.java
Auszug :

```
/** Construct Document (i.e. XML node tree) from data model and
     *  ask it to write itself out.
     *
     *  Note 1: Since JAXP 1.1, there is no simple, documented way to
     *  write out a Document object.  This code uses an undocumented
     *  trick.  There is a supported way via the XSLT library, but it
     *  is far more clumsy than this two-line trick.
     *
     *  Note 2: Another strategy would be just to println() the XML
     *  text straight from our data model.
     */
    public void writeXML(OutputStream o) {
        try {
            Writer out = new OutputStreamWriter(o);
            Document doc = createDocument();
            
            // Here's the trick:
            // 1. Downcast Document to a Crimson XmlDocument
            org.apache.crimson.tree.XmlDocument x =
                (org.apache.crimson.tree.XmlDocument) doc;

            // 2. XmlDocument knows how to write itself out -- woo hoo!
            x.write(out, "UTF-8");
            out.close();
        }
        catch (Exception e) {
            System.err.println("Save XML err:" + e);
        }
    }
```


  --  --  muckelzwerg


----------



## Sneakizzel (27. Jul 2006)

> Wieso "muss" das gehen ?



Ich wollte sagen das ich es mit diesen Komponenten realisieren möcht/muss, ob bzw. wie einfach es damit geht weiss ich nicht. Es scheint aber das es ein großer Aufwand mit JAXP 1.0.1 ist im Gegensatz zu JAXP 1.1 aber ich hab nun mal nur die 1.0.1 zur Verfügung. 

sneaker


----------



## muckelzwerg (27. Jul 2006)

Sorry, ich meinte foobar.

So groß finde ich den Aufwand eigentlich nicht.
Falls Du Crimson verwenden darst, sind es zwei Zeilen,
Falls nicht, hast Du eine fast ferige Funktion an der Hand.

Muss das überhaupt JAXP sein ? 
Wenn Du bloß ein Tag ersetzen willst, reichen ja auch regexp.

  --  --  muckelzwerg


----------



## Sneakizzel (31. Jul 2006)

Mhh, erstmal Danke für die Antworten,

ich hab das Problem wie folgt gelöst:


```
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(new File("layout.xml").toURL().toString());

ersetzeTag(); 

NodeList list = doc.getElementsByTagName("<<äußerster TAG");
			
for(int i=0; i < list.getLength(); i++){
	file = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + list.item(i);
}
```

So wird das ganze XML-Gerödel als String ausgegeben ledeglich_ <?xml version="1.0" encoding="utf-8"?> _ muss noch davor geprügelt werden. Tja und vom String isses zum File ja auch nicht mehr weit   .

Danke für Eure Hilfe
sneaker


----------

