XML Java

Jorin5

Mitglied
Hallo Leute

Bräuchte dringend mal hilfe. Ich bin dabei Java zu lernen. Ich möchte gerne einen Adressverwaltung schreiben, die Adressen werden in XML abgespeichert.

Sobald ich eine neue Adresse erfasse speichert er zwar in der XML datei aber die bestehende Daten in XML werden mit der neue Daten überschrieben.

Mein Java Code:

PHP:
package Controller;

import java.io.FileOutputStream;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.xml.bind.JAXBContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;



import GUI.GUI_add;

public class DateInXML {

	private String vorname;
	private String nachname;
	private String adresse;
	private String plz;
	private String ort;
	private String mail;
	private String telefon;
	private String fax;
	private String homepage;
	
	Vector data;
	Vector columns;

	public void setDate(JTextField textField, JTextField textField_1,
			JTextField textField_2, JTextField textField_3,
			JTextField textField_4, JTextField textField_5,
			JTextField textField_6, JTextField textField_7,
			JTextField textField_8) {

		this.vorname = textField.getText();
		this.nachname = textField_1.getText();
		this.adresse = textField_2.getText();
		this.plz = textField_3.getText();
		this.ort = textField_4.getText();
		this.mail = textField_5.getText();
		this.telefon = textField_6.getText();
		this.fax = textField_7.getText();
		this.homepage = textField_8.getText();

		/*
		 * System.out.println(vorname); System.out.println(nachname);
		 * System.out.println(adresse); System.out.println(plz);
		 * System.out.println(ort); System.out.println(mail);
		 * System.out.println(telefon); System.out.println(fax);
		 * System.out.println(homepage);
		 */

	}
	

	public void saveConfig() throws Exception {
		// Create a XMLOutputFactory
		XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
		// Create XMLEventWriter
		XMLEventWriter eventWriter = outputFactory
				.createXMLEventWriter(new FileOutputStream("person.xml"));
		// Create a EventFactory
		XMLEventFactory eventFactory = XMLEventFactory.newInstance();
		XMLEvent end = eventFactory.createDTD("\n");
		// Create and write Start Tag
		StartDocument startDocument = eventFactory.createStartDocument();
		eventWriter.add(startDocument);

		// Create config open tag
		StartElement configStartElement = eventFactory.createStartElement("",
				"", "Persons");
		StartElement configStartElement1 = eventFactory.createStartElement("",
				"", "Person");
		eventWriter.add(configStartElement);
		eventWriter.add(configStartElement1);
		eventWriter.add(end);

		// Write the different nodes
		/*
		 * createNode(eventWriter, "vorname", vorname); createNode(eventWriter,
		 * "nachname", nachname); createNode(eventWriter, "adresse", adresse);
		 * createNode(eventWriter, "plz", plz); createNode(eventWriter, "ort",
		 * ort); createNode(eventWriter, "mail", mail); createNode(eventWriter,
		 * "telefon", telefon); createNode(eventWriter, "fax", fax);
		 * createNode(eventWriter, "homepage", homepage);
		 */
		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse("person.xml");

		NodeList nl = doc.getElementsByTagName("Name");
		NodeList n2 = doc.getElementsByTagName("Address");
		NodeList n3 = doc.getElementsByTagName("ContactNo");
		NodeList listOfPersons = doc.getElementsByTagName("Person");

		String data1 = "", data2 = "", data3 = "";
		data = new Vector();
		columns = new Vector();
		for (int i = 0; i < listOfPersons.getLength(); i++) {
			data1 = nl.item(i).getFirstChild().getNodeValue();
			data2 = n2.item(i).getFirstChild().getNodeValue();
			data3 = n3.item(i).getFirstChild().getNodeValue();
			String line = data1 + " " + data2 + " " + data3;
			StringTokenizer st2 = new StringTokenizer(line, " ");
			System.out.println();
			while (st2.hasMoreTokens())
				data.addElement(st2.nextToken());
			
		}
		columns.add("");
		columns.add("");
		columns.add("");

		createNode(eventWriter, "Name", vorname);
		createNode(eventWriter, "Address", adresse);
		createNode(eventWriter, "ContactNo", telefon);

		eventWriter.add(end);
		eventWriter.add(eventFactory.createEndDocument());
		eventWriter.close();
		JOptionPane.showMessageDialog(null, "Eintrag gespeichert");
		
		

	}

	private void createNode(XMLEventWriter eventWriter, String name,
			String value) throws XMLStreamException {

		XMLEventFactory eventFactory = XMLEventFactory.newInstance();
		XMLEvent end = eventFactory.createDTD("\n");
		XMLEvent tab = eventFactory.createDTD("\t");
		// Create Start node
		StartElement sElement = eventFactory.createStartElement("", "", name);
		eventWriter.add(tab);
		eventWriter.add(sElement);
		// Create Content
		Characters characters = eventFactory.createCharacters(value);
		eventWriter.add(characters);
		// Create End node
		EndElement eElement = eventFactory.createEndElement("", "", name);
		eventWriter.add(eElement);
		eventWriter.add(end);

	}

}

Mein XML inhalt:
$
PHP:
<?xml version="1.0"  encoding="UTF-8"  standalone="no"?>

<Persons>

<Person>
<Name>test1</Name>
<Address>test1</Address>
<ContactNo>111111</ContactNo>
</Person>

<Person>
<Name>test2</Name>
<Address>test2</Address>
<ContactNo>222222</ContactNo>
</Person>

</Persons>

Ich müsste es vorher auslesen und danach wieder abspeichern. Aber kein plan wie ich es machen will, hoffe um unterstützung.
 
Auslesen aus einer XML-Datei ist nicht schwer

Java:
String path = "xmlFile.xml";
File xmlFile = new File(path);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc doc = builder.parse(xmlFile);

NodeList nl = doc.getElementsByTagName("Person");
                 for(int i = 0; i < nl.getLength(); i++)
                 {
                     Element n = (Element) nl.item(i);
                     String name= n.getElementsByTagName("Name").item(0).getTextContent();
                     String address= n.getElementsByTagName("Address").item(0).getTextContent();
                     String contactno= n.getElementsByTagName("ContactNo").item(0).getTextContent();
               

                 }
Die NodeList liefert dir am Anfang alle Personknoten.
In der for-Schleife wird dann die NodeList durchgelaufen. Element n steht hier für die Person.
Java:
String name= n.getElementsByTagName("Name").item(0).getTextContent();
Bewirkt dann folgendes. Mit n.getElementsByTagName("Name") bekommt man alle Namenknoten. Da ja in der Person immer nur ein Name vorhanden ist, kann man es mit .item(0) abrufen. Danach holt man sich noch mit .getTextContent(); den Inhalt des Knoten.

Ich habe den Code aus einem meiner Programme kopiert, welches ähnlich funktioniert. Ich habe bereits versucht den Code an dein XML-File anzupassen... kann sein das du noch etwas nachbessern musst.

Zu deinem Problem mit dem Hinzufügen:
Ich löse das Problem immer so: Am Programmstart werden alle Personen in eine Liste eingelesen. Während das Programm läuft, werden die Personen immer nur zur Liste hinzugefügt. Wenn das Programm beendet wird, werden alle Personen in die xml Datei gespeichert.

Ich hoffe ich konnte helfen :)
 
Klar

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
 
hm.. ich habe es versucht aber bin funktioniert nicht >.<

Kannst du das mal in mein code implementieren ? und mir es noch kommentieren `?

Danke
 
Lese den Inhalt der XML Datei ein (InputStream), wandle es in einen String um, baue dir einen zweiten String mit deinem neuen <Person>...</Person> Element. Suche dann in dem String mit dem File-Inhalt nach </Persons> und ersetze diese mit deinem zweiten String inkl. einem neuen </Persons> Endtag. Schreibe anschließend alles zurück in dein File (OutputStream).

Okay, ich weiß es ist keine elegante Lösung, aber wenn du eine einfach Lösung benötigst ohne jetzt groß XPATH/XQuery Requests zu machen, sollte der Hack funktionieren ;)
 
Tut mir leid das ich erst heute antworte, ich war die letzten Tage krank...
Für den Fall das du es noch brauchst, habe ich hier eine Testklasse geschrieben, die funktioniert. Im ersten Code ist mir ein Fehler unterlaufen in der Zeile
Java:
Document doc doc = builder.parse(xmlFile);
natürlich ist das falsch und es gehört nur ein "doc" hin ^^

Hier die Testklasse:

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mypdfviewer;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author Bernhard
 */
public class XMLTest {

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {

        String path = "xmlFile.xml";
        File xmlFile = new File(path);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc  = builder.parse(xmlFile);

        NodeList nl = doc.getElementsByTagName("Person");
        for (int i = 0; i < nl.getLength(); i++) {
            Element n = (Element) nl.item(i);
            String name = n.getElementsByTagName("Name").item(0).getTextContent();
            String address = n.getElementsByTagName("Address").item(0).getTextContent();
            String contactno = n.getElementsByTagName("ContactNo").item(0).getTextContent();
            System.out.println(name +";"+address + ";" + contactno);

        }
    }
}
Liefert folgenden output:
Code:
run:
test1;test1;111111
test2;test2;222222
BUILD SUCCESSFUL (total time: 1 second)
Die XML File sieht so aus:
Code:
<?xml version="1.0"  encoding="UTF-8"  standalone="no"?> 

<Persons> 

<Person> 
<Name>test1</Name> 
<Address>test1</Address> 
<ContactNo>111111</ContactNo> 
</Person> 

<Person> 
<Name>test2</Name> 
<Address>test2</Address> 
<ContactNo>222222</ContactNo> 
</Person> 

</Persons>
 
Cool danke leute habs hinbekommen aber nun möchte ich die einzelnen Notes löschen mit den dazugehörigen Element. Wie mache ich das am besten ?

ich muss noch wahrscheinlich erwähnen dass sich mein XML einbisschen geändert hat

es sieht jetzt wie gefolgt aus:
XML:
<?xml version="1.0"  encoding="UTF-8"  standalone="no"?>

<Persons>

<Person>
<ID>0</ID>
<Name>test1</Name>
<Address>test1</Address>
<ContactNo>111111</ContactNo>
</Person>

<Person>
<ID>1</ID>
<Name>test2</Name>
<Address>test2</Address>
<ContactNo>222222</ContactNo>
</Person>

</Persons>
Ich bin soweit das ich In JTabel auf onClick die ID des Eintrags rausgibt, aber ich weiss nicht wie ich es komplett aus der XML Datei löschen söll.
 
Zuletzt bearbeitet von einem Moderator:
Hey,

als Anmerkung:
Deine Klasse

Java:
public class DateInXML {

    private String vorname;
    private String nachname;
    private String adresse;
    private String plz;
    private String ort;
    private String mail;
    private String telefon;
    private String fax;
    private String homepage;

beinhaltet Elemente, die im engeren Sinne nicht in das Objekt gehören.

Ich würde dir vorschlagen eine Klasse "Person" (oder Vergleichbare) zu erstellen;
dort mit Getter/Setter zu arbeiten und deine Klasse DateInXML anschließend mit "Person"-Objekten arbeiten zu lassen.

mfg
bo
 
Zurück