# XML lesen und schreiben



## Steff87 (6. Jun 2011)

Hallo zusammen!

ich möchte aus einer XML-Datei lesen und Werte von dieser Datei ändern. Das Lesen der Datei funktioniert schon nicht schlecht, aber wie ich werte ändere weiß ich nicht, bzw. werden nicht in die XML-Datei übertragen. Ich verwende dabei DOM. 
Ich weiß, dass das relativ langsam ist. Wenn es etwas gibt, das schneller ist und mit dem man die XML-Datei ändern kann, ohne diese neu zuschreiben, nur her damit. Es sollte aber ohne zusätliche Bibliotheken auskommen.
Hier erstmal den Code, was ich gemacht habe:

```
mport java.awt.Color;
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

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

public class XMLReader {
	
	public static final String MAX_SPEED = "maxSpeed";
	public static final String ROTATION = "rotation";
	public static final String ACC_X = "accX";
	public static final String ACC_Y = "accY";
	public static final String ACC_Z = "accZ";
	
	DocumentBuilderFactory factory = null;
	DocumentBuilder builder = null;
	Document document = null;
	File xmlSorce;
	
	public XMLReader() {
		xmlSorce = new File("RevColor.xml");
		factory = DocumentBuilderFactory.newInstance();
		try {
			builder = factory.newDocumentBuilder();
			document = builder.parse(xmlSorce);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	Color[] getColors(String visOption){
		NodeList color = null;
		Node red=null;
		Node green = null;
		Node blue = null;
		int[] tmpColors={0,0,0};
		Color[] colors = {null, null, null};
	    NodeList childs = document.getElementsByTagName(visOption).item(0).getChildNodes();
	    System.out.println(childs.getLength());
	    for(int i =0 ; i<childs.getLength(); i++){
	    	if(childs.item(i).getNodeName().equalsIgnoreCase("colorGood")){
	    		color = childs.item(i).getChildNodes();
	    		for (int j=0;j<color.getLength();j++){
	    			if(color.item(j).getNodeName().equals("Red")){
	    				red = color.item(j);
	    				tmpColors[0] = Integer.parseInt(red.getTextContent());
	    			}else if(color.item(j).getNodeName().equals("Green")){
	    				green = color.item(j);
	    				tmpColors[1] = Integer.parseInt(green.getTextContent());
	    			}else if(color.item(j).getNodeName().equals("Blue")){
	    				blue = color.item(j);
	    				tmpColors[2] = Integer.parseInt(blue.getTextContent());
	    			}
	    		}
	    		colors[0] = new Color(tmpColors[0],tmpColors[1], tmpColors[2]);
	    	}
	    	
	    	if(childs.item(i).getNodeName().equalsIgnoreCase("colorOK")){
	    		color = childs.item(i).getChildNodes();
	    		for (int j=0;j<color.getLength();j++){
	    			if(color.item(j).getNodeName().equals("Red")){
	    				red = color.item(j);
	    				tmpColors[0] = Integer.parseInt(red.getTextContent());
	    			}else if(color.item(j).getNodeName().equals("Green")){
	    				green = color.item(j);
	    				tmpColors[1] = Integer.parseInt(green.getTextContent());
	    			}else if(color.item(j).getNodeName().equals("Blue")){
	    				blue = color.item(j);
	    				tmpColors[2] = Integer.parseInt(blue.getTextContent());
	    			}
	    		}
	    		colors[1] = new Color(tmpColors[0],tmpColors[1], tmpColors[2]);
	    	}
	    	if(childs.item(i).getNodeName().equalsIgnoreCase("colorBad")){
	    		color = childs.item(i).getChildNodes();
	    		for (int j=0;j<color.getLength();j++){
	    			if(color.item(j).getNodeName().equals("Red")){
	    				red = color.item(j);
	    				tmpColors[0] = Integer.parseInt(red.getTextContent());
	    			}else if(color.item(j).getNodeName().equals("Green")){
	    				green = color.item(j);
	    				tmpColors[1] = Integer.parseInt(green.getTextContent());
	    			}else if(color.item(j).getNodeName().equals("Blue")){
	    				blue = color.item(j);
	    				tmpColors[2] = Integer.parseInt(blue.getTextContent());
	    			}
	    		}
	    		colors[2] = new Color(tmpColors[0],tmpColors[1], tmpColors[2]);
	    	}
	    }
		return colors;
	}
	
	void setColor(String visOption, int index, Color color){
		NodeList colorNodes = null;
		Node red=null;
		Node green = null;
		Node blue = null;
	    NodeList childs = document.getElementsByTagName(visOption).item(0).getChildNodes();
	    System.out.println(childs.getLength());
	    for(int i =0 ; i<childs.getLength(); i++){
	    	if(childs.item(i).getNodeName().equalsIgnoreCase("colorGood")){
	    		colorNodes = childs.item(i).getChildNodes();
	    		for (int j=0;j<colorNodes.getLength();j++){
	    			if(colorNodes.item(j).getNodeName().equals("Red")){
	    				red = colorNodes.item(j);
	    				red.setTextContent(color.getRed()+"");
	    			}else if(colorNodes.item(j).getNodeName().equals("Green")){
	    				green = colorNodes.item(j);
	    				green.setTextContent(color.getGreen()+"");
	    			}else if(colorNodes.item(j).getNodeName().equals("Blue")){
	    				blue = colorNodes.item(j);
	    				blue.setTextContent(color.getBlue()+"");
	    			}
	    		}
	    	}
	    }	    
	}
	
	public static void main(String[] args) {
		XMLReader reder = new XMLReader();
		reder.getColors(XMLReader.ACC_X);
		reder.setColor(MAX_SPEED, 0, new Color(215,0,22));
	}
}
```
und die notwendige xml-Datei:

```
<?xml version="1.0" ?>
<visualColor>
	<maxSpeed>
		<colorGood>
			<Red>0</Red>
			<Blue>0</Blue>
			<Green>255</Green>
		</colorGood>
		<colorOK>
			<Red>255</Red>
			<Blue>255</Blue>
			<Green>0</Green>
		</colorOK>
		<colorBad>
			<Red>255</Red>
			<Blue>0</Blue>
			<Green>0</Green>
		</colorBad>
	</maxSpeed>
	<rotation>
		<colorGood>
			<Red>0</Red>
			<Blue>0</Blue>
			<Green>255</Green>
		</colorGood>
		<colorOK>
			<Red>255</Red>
			<Blue>255</Blue>
			<Green>0</Green>
		</colorOK>
		<colorBad>
			<Red>255</Red>
			<Blue>0</Blue>
			<Green>0</Green>
		</colorBad>
	</rotation>
	<accX>
		<colorGood>
			<Red>0</Red>
			<Blue>0</Blue>
			<Green>255</Green>
		</colorGood>
		<colorOK>
			<Red>255</Red>
			<Blue>255</Blue>
			<Green>0</Green>
		</colorOK>
		<colorBad>
			<Red>255</Red>
			<Blue>0</Blue>
			<Green>0</Green>
		</colorBad>
	</accX>
	<accY>
		<colorGood>
			<Red>0</Red>
			<Blue>0</Blue>
			<Green>255</Green>
		</colorGood>
		<colorOK>
			<Red>255</Red>
			<Blue>255</Blue>
			<Green>0</Green>
		</colorOK>
		<colorBad>
			<Red>255</Red>
			<Blue>0</Blue>
			<Green>0</Green>
		</colorBad>
	</accY>
	<accZ>
		<colorGood>
			<Red>0</Red>
			<Blue>0</Blue>
			<Green>255</Green>
		</colorGood>
		<colorOK>
			<Red>255</Red>
			<Blue>255</Blue>
			<Green>0</Green>
		</colorOK>
		<colorBad>
			<Red>255</Red>
			<Blue>0</Blue>
			<Green>0</Green>
		</colorBad>
	</accZ>
</visualColor>
```

ich hoffe, dass mir jemand helfen kann. Vielleicht gibts ja auch schon was in diesem Forum, dass ich nicht gefunden habe.

Danke schon mal an alle.


----------



## SlaterB (6. Jun 2011)

du musst schon noch manuell speichern nach den Änderungen, das geänderte Document ist unabhängig von seiner Quelle,

Suche z.B. 'org.w3c.dom.document to file'

Writing Out a DOM as an XML File
org.w3c.dom.Document -> java.io.File : Formatierung nicht schön @ tutorials.de: Tutorials, Forum & Hilfe
usw.


----------



## aze (6. Jun 2011)

Steff87 hat gesagt.:


> Hallo zusammen!
> 
> ich möchte aus einer XML-Datei lesen und Werte von dieser Datei ändern. Das Lesen der Datei funktioniert schon nicht schlecht, aber wie ich werte ändere weiß ich nicht, bzw. werden nicht in die XML-Datei übertragen. Ich verwende dabei DOM.
> Ich weiß, dass das relativ langsam ist. Wenn es etwas gibt, das schneller ist und mit dem man die XML-Datei ändern kann, ohne diese neu zuschreiben, nur her damit. Es sollte aber ohne zusätliche Bibliotheken auskommen.



Eine Alternative wäre sonst ein Xml-Object Mapper wie Jaxb.Der ist auch schon in Java standardmässig drin.Damit kann man Xml Dateien in Objekte umwandeln und diese später wieder als Xml Datei exportieren.Das ganze wird mit Annotationen gesteuert und würde sicherlich wenig Code brauchen als deine Lösung.


----------

