# value Wert einer XML Datei mit JAVA bearbeiten



## NNiko (7. Aug 2009)

Hallo ich hab folgendes Problem, ich will mit Java auf den value Wert innerhalb eines Tags einer XML Datei zugreifen.
Die XML Datei sieht wie folgt aus:

[xml]<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><APP>
	<Test>
		<SETTINGS>
			<LANGUAGE value="DE"/>
			<REGION value="XY"/>
			<CUSTOMER value="XYZ"/>
		</SETTINGS>
	</Test>
</APP>[/xml]


Leider finde ich hier sowie über google nichts darüber wie ich auf diesen value Wert zugreifen kann und ihn ändern kann.
Das liegt aber wohl am größten Teil auch daran, das ich blutiger Anfänger bin und mir wohl auch die richigen Stichworte für die gezielte Suche fehlen.
Mit dem bisherigen Code den ich geschrieben habe:


```
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Test {

    Test() {

        final String XMLFILENAME = "CONFIGINIT_APP_BASECONFIG.XML";

        try {


            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(XMLFILENAME);

            String LANGUAGE = document.getElementsByTagName("LANGUAGE").item(0).getTextContent();


            System.out.println("Alter Wert:");
            System.out.println(LANGUAGE);


            LANGUAGE = "Test";

            System.out.println("\nNeuer Wert:");
            System.out.println(LANGUAGE);


            document.getElementsByTagName("LANGUAGE").item(0).getTextContent();

            TransformerFactory.newInstance().newTransformer().transform(
                    new DOMSource(document), new StreamResult(new FileOutputStream(XMLFILENAME)));

        } catch (ParserConfigurationException e) {

            e.printStackTrace();
        } catch (SAXException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        } catch (TransformerConfigurationException e) {

            e.printStackTrace();
        } catch (TransformerException e) {

            e.printStackTrace();
        } catch (TransformerFactoryConfigurationError e) {

            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Test();

    }

}
```


bekomme ich lediglich diesen Output im XML File:


<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><APP>
	<Test>
		<SETTINGS>
<LANGUAGE value="DE">Test</LANGUAGE>
			<REGION value="XY"/>
			<CUSTOMER value="XYZ"/>
		</SETTINGS>
	</Test>
</APP>


Kann mir bitte jemand weiterhelfen. 

Vielen Dank schon mal im vorraus!


----------



## Noctarius (7. Aug 2009)

Die Tags gibt es nicht zum Spaß. Ohne diese ist Javacode nahezu unlesbar und dir wird sicher keiner helfen wollen. Ich hab das mal aufgehübscht.

Ohne jetzt genau nach deinem Code zu schauen: Wieso benutzt du nicht gleich X-Path?


----------



## NNiko (7. Aug 2009)

Danke fürs "aufhübschen"!  :toll:
Ist mein erster Eintrag und ich habs einfach vergessen.

Deinen Tip mit XPath hab ich mir mal anhand dieses Forums nähergeführt und bin zu folgenden gekommen

```
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class CONFIGINIT_APP_BASECONFIG {

    public static void main (String[] args){

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true); // never forget this!
        DocumentBuilder builder;
        try {
            builder = factory.newDocumentBuilder();
            Document doc = builder.parse("C:\\Dokumente und Einstellungen\\nuesslen\\Desktop\\Praxisarbeit\\CONFIGINIT_APP_BASECONFIG.XML");

            XPathFactory factoryX = XPathFactory.newInstance();
            XPath xpath = factoryX.newXPath();
            XPathExpression expr = xpath.compile("/BASECONFIG/SETTINGS/REGION/@value");
            Object result = expr.evaluate(doc, XPathConstants.NODESET);
            NodeList nodes = (NodeList) result;
            for (char i = 0; i < nodes.getLength(); i++) {
                System.out.println(nodes.item(i).getNodeValue());
            }
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}
```

Jetzt sollte er eig. das Value in dem Tag auslesen, und anzeigen, jedoch liest er die Zeichen in dem Value nicht aus, woran könnte das hier liegen??


----------



## Noctarius (7. Aug 2009)

Wie kommst du denn auf BASECONFIG? Das kann ich in deinem Beispiel XML nicht sehen.


----------



## NNiko (7. Aug 2009)

Sorry xml file habe ich umgestrickt, sieht etzt so aus
[XML]<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><APP>
	<BASECONFIG>
		<SETTINGS>
			<LANGUAGE value="DE"/>
			<REGION value="XY"/>
			<APPLICATION value="XYZX"/>
			<CUSTOMER value="XYZ"/>
		</SETTINGS>
	</BASECONFIG>
</APP>[/XML]


----------



## NNiko (7. Aug 2009)

Also ich habs jetzt geschafft auf die Werte innerhalb der Xml Tags zuzugreifen. Jetzt muss ich sie nur noch ändern und wieder ins Xml speichern können.....


----------



## Noctarius (7. Aug 2009)

Wenn es um reines Search&Replace geht sollte als String einlesen und String.replace das einfachste sein.


----------



## ARadauer (7. Aug 2009)

NNiko hat gesagt.:


> Also ich habs jetzt geschafft auf die Werte innerhalb der Xml Tags zuzugreifen. Jetzt muss ich sie nur noch ändern und wieder ins Xml speichern können.....




ist das eine Frage? Brauchst du dabei hilfe?


----------



## NNiko (7. Aug 2009)

Ja, sorry, sollte eine Frage sein. Wollte wissen wie ich den oben geposteten Code so umstricken kann dass ich den Wert den ich für value ausgelesen habe ändern kann.

Ich möchte also quasi per Java die Xml Datei bearbeiten können in dem ich die value werte ändere und dies dann dort gleich wieder abspeichere.

Mein Problem ist, ich hab eig. erst vor 2 Tagen angefangen mich mit Java zu beschäftigen, hab also noch so gut wie keine Ahnung davon...


----------



## ARadauer (7. Aug 2009)

```
LANGUAGE = "Test";
```
sowas funktioniert nicht. du überschreibst die referenz und änderst nichts im dom baum....

ich schau mir das mal an....

CONFIGINIT_APP_BASECONFIG bitte an Code Konvetionen halten
ConfiginitAppBaseConfig...


----------



## NNiko (7. Aug 2009)

Danke schon mal fürs anschauen, schau dir aber bitte gleich den Code aus meinem 2.Post an, da ich den ersten schon wieder verworfen habe


----------



## ARadauer (7. Aug 2009)

mhn hab noch nie mit XPath gearbeitet, was hast du geändert, dass du das richtig auslesen können hast?


----------



## NNiko (7. Aug 2009)

IN Zeile 29 Statt:
XPathExpression expr = xpath.compile("/BASECONFIG/SETTINGS/REGION/@value");

musste ich es so schreiben

XPathExpression expr = xpath.compile("//BASECONFIG/SETTINGS/REGION/@value");

also mit // statt mit /


Mein Problem jetzt ist wie (und wo??) ich in diesen Code einfüge, dass er den Wert, den er liest und ausgibt auch bearbeiten kann


----------



## Noctarius (7. Aug 2009)

Wie wäre es damit? 
Node (Java Platform SE 6)


----------



## NNiko (7. Aug 2009)

Arbeite mich gerade da durch, danke. Bin nur am verzweifeln, da ich bei allem was ich so an Code neu einfüge irgend ne Fehlermeldung bekomme


----------



## ARadauer (7. Aug 2009)

ned verzweifeln..

das mit dom:

```
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse("test.xml");
       Node languageNode = document.getElementsByTagName("LANGUAGE").item(0);
       Node valueNode = languageNode.getAttributes().getNamedItem("value");


       System.out.println("Alter Wert:");
       System.out.println(valueNode.getTextContent());
       
       valueNode.setNodeValue("AT");


       System.out.println("\nNeuer Wert:");
       System.out.println(valueNode.getTextContent());


    
       TransformerFactory.newInstance().newTransformer().transform(
               new DOMSource(document), new StreamResult(new FileOutputStream("test.xml")));
```
das mit xpath.. kann auch nicht schwerer sein...


----------



## Noctarius (7. Aug 2009)

```
XPathExpression expr = xpath.compile("//BASECONFIG/SETTINGS/REGION/@value");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

for (int i = 0; i < nodes.getLength(); i++) {
	Node node = nodes.item(i);
	node.setNodeValue("Foo");
}
```


----------



## ARadauer (7. Aug 2009)

eh schmu...


```
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true); // never forget this!
        DocumentBuilder builder;
        try {
            builder = factory.newDocumentBuilder();
            Document doc = builder.parse("test.xml");
 
            XPathFactory factoryX = XPathFactory.newInstance();
            XPath xpath = factoryX.newXPath();
            XPathExpression expr = xpath.compile("//BASECONFIG/SETTINGS/REGION/@value");
            Object result = expr.evaluate(doc, XPathConstants.NODESET);
            NodeList nodes = (NodeList) result;
            System.out.println(nodes.getLength()+" mal gefunden");
            
             for (int i = 0; i < nodes.getLength(); i++) {
                System.out.println(i+1+". Alter Wert: "+nodes.item(i).getNodeValue());
                nodes.item(i).setNodeValue("BIER");
                System.out.println(i+1+". Neuer Wert: "+nodes.item(i).getNodeValue());
             }
             TransformerFactory.newInstance().newTransformer().transform(
                   new DOMSource(doc), new StreamResult(new FileOutputStream("test.xml")));
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
```


----------



## Noctarius (7. Aug 2009)

node.item(index) ja klar sorry


----------



## NNiko (11. Aug 2009)

Danke erst mal für die nette und schnelle Hilfe. Nur habe ich jetzt leider immer noch ein Problem. Wenn ich den Code von ARadauer für meine bedürfnisse nur leicht anpasse, bekomme ich leider eine Exception.

Mein Momentaner Code:

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;



import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class CONFIGINIT_APP_BASECONFIG {

    public static void main (String[] args){

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true); // never forget this!
        DocumentBuilder builder;
        try {
            builder = factory.newDocumentBuilder();
            Document doc = builder.parse("CONFIGINIT_APP_BASECONFIG.XML");

            XPathFactory factoryX = XPathFactory.newInstance();
            XPath xpath = factoryX.newXPath();
            XPathExpression expr = xpath.compile("//BASECONFIG/SETTINGS/REGION/@value");
            Object result = expr.evaluate(doc, XPathConstants.NODESET);
            NodeList nodes = (NodeList) result;
            System.out.println(nodes.getLength()+" gefunden");

             for (int i = 0; i < nodes.getLength(); i++) {
                System.out.println(i+1+". Alter Wert: "+nodes.item(i).getNodeValue());
                nodes.item(i).setNodeValue("BIER");
                System.out.println(i+1+". Neuer Wert: "+nodes.item(i).getNodeValue());
             }
             TransformerFactory.newInstance().newTransformer().transform(
                   new DOMSource(doc), new StreamResult(new FileOutputStream("CONFIGINIT_APP_BASECONFIG.XML")));
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
```

Und nun die Exception:
CONFIGINIT_APP_BASECONFIG.java:51:73: unreported exception javax.xml.transform.TransformerException; must be caught or declared to be thrown
             TransformerFactory.newInstance().newTransformer().transform(


----------



## NNiko (11. Aug 2009)

Ok habs jetzt gelößt, danke nochmal für eure schnelle Hilfe.


----------



## NNiko (11. Aug 2009)

Nun stehe ich aber schon vor einem neuen Problem. Ich soll einen der Value werte, in meinem Fall ist es der Inhalt des Value Tags bei CUSTOMER als Dateiname für eine bereits vorhandene XML Datei verwenden.

Bsp. Im Value des Tags bei CUSTOMER gebe ich Kunde1 ein:
[XML]<CUTOMER value"Kunde1"\>[/XML]

Bisher schreibt er mir die Änderung Kunde1 in ein xml File mit Name Test.xml:


```
TransformerFactory.newInstance().newTransformer().transform(
                   new DOMSource(doc), new StreamResult(new FileOutputStream("Test.xml")
```

dies Funktioniert dank eurer Hilfe auch optimal. Jetzt sollte ich aber noch hinzufügen, dass er eine im Verzeichnis schon vorhandene xml Datei mit dem Namen [XY]Costumer.xml, ändert. Hier soll er den inhat nich anfassen, sondern lediglich das XY in der Klammer umändern in [Kunde1]Costumer.xml .

Würde imich freuen wenn mir hierzu wieder einer einen Tip geben könnnte


----------

