value Wert einer XML Datei mit JAVA bearbeiten

Status
Nicht offen für weitere Antworten.

NNiko

Mitglied
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:

Java:
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!
 
Zuletzt bearbeitet von einem Moderator:
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?
 
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
Java:
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??
 
Zuletzt bearbeitet:
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]
 
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.....
 
Zuletzt bearbeitet:
Wenn es um reines Search&Replace geht sollte als String einlesen und String.replace das einfachste sein.
 
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...
 
Code:
            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...
 
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
 
mhn hab noch nie mit XPath gearbeitet, was hast du geändert, dass du das richtig auslesen können hast?
 
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
 
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
 
ned verzweifeln..

das mit dom:
Code:
  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...
 
Java:
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");
}
 
Zuletzt bearbeitet:
eh schmu...

Java:
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();
        }
 
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:
Java:
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(
 
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:

Java:
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben