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:

Noctarius

Top Contributor
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

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

NNiko

Mitglied
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

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

Noctarius

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

NNiko

Mitglied
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

Top Contributor
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...
 

NNiko

Mitglied
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

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

NNiko

Mitglied
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
 

NNiko

Mitglied
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

Top Contributor
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...
 

Noctarius

Top Contributor
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:

ARadauer

Top Contributor
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();
        }
 

NNiko

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

NNiko

Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Search Value in Json XML & JSON 6
K XML Schema list unique value restriction XML & JSON 0
C JDOM: Value ohne Unterelemente auslesen XML & JSON 1
N xml nach Value durchsuchen XML & JSON 8
H XMLConfiguration(1.10)/getString : Wert "E" aus <version type="Auto">E</version>n lesen XML & JSON 15
wofus JSON filtern nach bestimmten Wert XML & JSON 7
L JAXB - Generischen Wert mit Liste belegen XML & JSON 1
Landei JAXB: Wert von übergeordneten Element XML & JSON 4
J wert IN einem tag einlesen/schreiben XML & JSON 4
Nicer Bestimmten Wert aus einer XML Auslesen XML & JSON 34
A JDOM: Wert schreiben bzw. ändern XML & JSON 6
M Jaxb Annotationen, Wert als XML Element XML & JSON 2
M input-wert an servlet übergeben XML & JSON 3
M XSL/XPath - Nur ersten Wert mit selben Attribut XML & JSON 4
W Erzeugen einer openapi spec via swagger XML & JSON 1
W Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests XML & JSON 13
D Innerhalb einer Property auf eine andere verlinken? XML & JSON 3
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
M Layout + Inhalt einer JTable speichern XML & JSON 30
J Welche Gründe führen zu einer endlos tiefen XML? XML & JSON 4
T Pfad in einer Variablen speichern XML & JSON 1
E Wie kann ich ein XSD-Schema in einer JSP-Seite verwenden? XML & JSON 7
T Visualisierung von XML Dateien in einer Java SwingGui XML & JSON 11
R XSD in einer choice mehrmals das selbe element möglich XML & JSON 5
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
F Parsen von Daten aus einer Homepage XML & JSON 6
B XML aus einer URL im Internet lesen (JDOM) XML & JSON 4
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
B 2 Attribute in einer xsl XML & JSON 2
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
T Schreiben einer XML XML & JSON 8
B XML auf Basis einer DTD erstellen XML & JSON 2
hdi Probleme beim Erstellen einer XML XML & JSON 7
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
sylo Mehrere XSDs und mehrere Namensräume in einer XML unterbringen? XML & JSON 2
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
J xmlencoder Zustände einer Bean schreiben XML & JSON 3
S Probleme beim erstellen einer Jar XML & JSON 12
J Problem mit compile einer XSD XML & JSON 3
S Einlesen einer xml Datei XML & JSON 4
F hilfe bei einer aufgabe XML & JSON 3
D Anzahl der Knoten in einer XML XML & JSON 6
R Parsen einer XML ohne Validierung XML & JSON 2
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M Xerces -Parsen mit einer externen Schemadatei geht nicht XML & JSON 2
cybermat Ergebnis einer XSLT-Tansformation als Rückgabewert erhalten XML & JSON 4
J Fehler beim laden einer .xml XML & JSON 3
ven000m Übungsaufgabe: Valide und gültige XML Datei zu einer DTD XML & JSON 7
A Auslesen einer XML Datei XML & JSON 58
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
P Knoten-Attribute einer xsd-Datei in einem JTree auslesen XML & JSON 18
T Einfach nur die Elemente einer XML Datei auslesen :( XML & JSON 10
Z Erzeugung einer Referenz von Knoten in JTree auf DOMTree XML & JSON 3
A Element an einer bestimmten Stelle einfügen (nicht am Ende) XML & JSON 4

Ähnliche Java Themen

Neue Themen


Oben