Hallo zusammen,
ich versuch aus einer CSV Datei eine XML Datei zu machen. Die XML Datei will ich dann später noch in Java bearbeiten, sprich bei den einzelnen Personen die Werte in den Elementen ändern. Soweit bin ich gekommen:
Die gewünschte XML soll am Ende ungefähr so aussehen:
Meine Frage ist jetzt: Wie kann ich automatisch die Attribute als Elemente in die Personen schreiben? Die Werte sind jeweils nur Platzhalter und können zuerst übersehen werden.
Hier noch meine test.csv:
Ich bin mir nicht ganz sicher, ob ich mich verständlich ausgedrückt habe, ansonsten fragt bitte einfach.
ich versuch aus einer CSV Datei eine XML Datei zu machen. Die XML Datei will ich dann später noch in Java bearbeiten, sprich bei den einzelnen Personen die Werte in den Elementen ändern. Soweit bin ich gekommen:
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class Readline {
public static void main(String[] args) {
String fileName = "test.csv";
ArrayList<Integer> margins = new ArrayList<Integer>();
BufferedReader br;
String line, token;
int i;
int csvCount = 0;
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// root element
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Individuen");
doc.appendChild(rootElement);
br = new BufferedReader(new FileReader(fileName));
try {
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ",\"");
i = 0;
while (st.hasMoreTokens()) {
token = st.nextToken();
if (margins.size() <= i) {
margins.add((Integer) token.length());
} else {
margins.set(i, Math.max(margins.get(i), (Integer) token.length()));
}
i++;
}
}
br = new BufferedReader(new FileReader(fileName));
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ",\"");
i = 0;
while (st.hasMoreTokens()) {
token = st.nextToken();
if (csvCount == 5){ //Nächste Zahl ist ID (=Menge an Personen)
int a = 0;
while (a <= Integer.parseInt(token)) {
//Erstes Element und "root" der Personen
Element person = doc.createElement("Person");
rootElement.appendChild(person);
//ID Attribut für späteren Aufruf
person.setAttribute("id", Integer.toString(a));
//Andere Attribute
Element attribute = doc.createElement("Attribut_2");
person.appendChild(attribute);
a++;
}
}
if (token.equals("ID")){
}
System.out.print(token);
System.out.print("|");
i++;
csvCount++;
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
// XML schreiben
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("test.xml"));
transformer.transform(source, result);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (TransformerConfigurationException tce) {
tce.printStackTrace();
} catch (TransformerException te) {
te.printStackTrace();
}
}
}
Die gewünschte XML soll am Ende ungefähr so aussehen:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Individuen>
<Person id="1">
<Attribut_1/>
<Attribut_2/>
...
</Person>
<Person id="2">
...
</Person>
...
</Individuen>
Meine Frage ist jetzt: Wie kann ich automatisch die Attribute als Elemente in die Personen schreiben? Die Werte sind jeweils nur Platzhalter und können zuerst übersehen werden.
Hier noch meine test.csv:
Code:
ID,Attribute 1,Attribute 2,Attribute 3,Attribute 4
105,1,2,3,4
Ich bin mir nicht ganz sicher, ob ich mich verständlich ausgedrückt habe, ansonsten fragt bitte einfach.