XML-File mit Java erzeugt Frage

h00b

Mitglied
Hallo,

ich bin relativ neu in der Materie und habe einek kurze Frage.

Ich habe mit Java ein XML-File erzeugt und entsprechend mit JSP Formulareingaben hinzugefügt. Außerdem habe ich ein Schema gemacht welches für die XML-Datei Maßgebend sein soll.

Das Problem ist jedesmal wenn eingaben in das formular gemacht werden legt er mir eine neue File an. Ich möchte aber, dass er in das schon bestehende File neue Einträge macht.

Beispiel XML-Datei:
[Java]
<ns1:ConfigurationItem>
<ns1:Name></ns1:Name>
<ns1:Beschreibung></ns1:Beschreibung>
<ns1:Name></ns1:Name>
</ns1:ConfigurationItem>
<ns1:ConfigurationItem>
<ns1:Name></ns1:Name>
<ns1:Beschreibung></ns1:Beschreibung>
<ns1:Name></ns1:Name>
</ns1:ConfigurationItem>

Der JavaCOde den ich habe sieht wie folgt aus:
try{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

//Wurzelelement anlegen
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Root");
doc.appendChild(rootElement);

Element ConfigurationItem = doc.createElement ("ConfigurationItem");
rootElement.appendChild(ConfigurationItem);

//Name Element anlegen
Element Name = doc.createElement ("Name");
Name.appendChild(doc.createTextNode(request.getParameter("Name")));
ConfigurationItem.appendChild(Name);

//Beschreibung Element anlegen
Element Beschreibung = doc.createElement("Beschreibung");
Beschreibung.appendChild(doc.createTextNode(request.getParameter("Beschreibung")));
ConfigurationItem.appendChild(Beschreibung);

//Autor Element anlegen
Element Autor = doc.createElement("Autor");
Autor.appendChild(doc.createTextNode (request.getParameter("Autor")));
ConfigurationItem.appendChild(Autor);

//schreibt in XML-File
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("D:\\file.xml"));

transformer.transform(source, result);

System.out.println("Datei gespeichert!");

} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (TransformerException tfe) {
tfe.printStackTrace();
}
[/Java]

Wenn mir jemand helfen könnte wäre das super.

Viele Grüße
NIco
 
wenn du einfach nur den kompletten Text anhängen willst, gibt es FileOutputStream mit append-Parameter,
aber das schreibt sicherlich mehrere abgeschlossene XML-Dateien hintereinander,
direkt in eine andere Datei nur den inneren Teil einfügen, das ist für die Automatik nicht wirklich eine Option
(wohl aber für dich im Anschluss mit Schnipp-Schnapp-Schere denkbar)

das sinnvolle Vorgehen wäre hier, die vorhandene Datei zu einem Document einzulesen,
neue Nodes einzufügen und dann das Gesamt-Document zu speichern
 
Hallo,

zunächst mal Danke für die Antwort.

Ich dachte daran diesen Teil:
Java:
Document doc = docBuilder.newDocument();

ind eine If-ANweisung packen die sowas sagt wie "If kein DOkument existiert dann mache ein neues else schreibe in das schon bestehende"

Das wird sich dann auch hier wiederspiegeln:
Java:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("D:\\Verknüpfungen.xml"));

das Problem ist ich komm momentan nicht darauf wie ich den Code umschreiben müsste bzw. welcher befehl in das neue Doc reinschreibt anstatt ein neues zu machen.
 
ich wie sagte, gibt es kein 'schreibe in das schon bestehende'
du musst das bestehende erst als Document einlesen, was für sich doch gewiss eine machbare Aufgabe ist
 
Hallo Slater,

ich habe das ganze jetzt soweit, dass er es parset wenn das .xml existiert also wenn ich das richtig verstehe ein DOM-Tree erzeugt. Dann sollte es mir doch Möglich sein neue Elemente anzulegen oder irre ich mich?
Java:
try {
            File file = new File ("D:\\CIs.xml");
   if (file.exists()){
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder;
            docBuilder = docFactory.newDocumentBuilder();
            Document doc;
            doc = docBuilder.parse(file);
            doc.getDocumentElement().normalize();
   
            Element ConfigurationItem = doc.createElement ("ConfigurationItem");
            rootElement.appendChild(ConfigurationItem);

das Problem am obigen Code ist, dass er den root Knoten obwohl er im XML-Dokument existiert nicht erkennt.

Die else anweisung legt ein neues Element an wenn nicht vorhanden das funktioniert einwandfrei (immernoch)...

Viele Dank nochmal.
Grüße
Nico
 
> dass er den root Knoten obwohl er im XML-Dokument existiert nicht erkennt.

kannst du das genauer fassen? welche Code-Zeilen verwendest du dafür, zuletzt gepostest willst du in rootElement etwas einfügen, obwohl rootElement noch nichts vom doc weiß, wohl null ist

welche Code-Zeilen, rootElement = doc.getRoot(); oder irgendwie sowas?
welche Compiler-Fehler oder Laufzeit-Exceptions?
welches sonstiges Fehlverhalten exakter beschrieben als 'nix gehen'? 😉
 
Hallo Slater,

du sagtest ja oben ich soll das File einlesen und somit ein XML erstellen, das ist passiert.

Jetzt möchte ich im endeffekt zu dem schon bestehenden und geparsten XML-File neue Elemente hinzufügen.
sos ieht die XML bisher aus:

<Root>
<ConfigurationItem>
<Name>Name</Name>
<Beschreibung>Beschreibung</Beschreibung>
<Autor>Autor</Autor>
</ConfigurationItem>
</Root>

Das soll neu angelegt werden:

<Root>
<ConfigurationItem>
<Name>Name</Name>
<Beschreibung>Beschreibung</Beschreibung>
<Autor>Autor</Autor>
</ConfigurationItem>
<ConfigurationItem>
<Name>Name</Name>
<Beschreibung>Beschreibung</Beschreibung>
<Autor>Autor</Autor>
</ConfigurationItem>

</Root>

Ich dachte durch das parsen kennt er den Baum und ich kann einfach neue Elemente mit der Methode create.Element hinzufügen an der entsrechenden stelle.

Allerdings ist das wohl nicht erlaubt an dieser stelle hier die Fehlermeldung: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted.

Die Frage ist hier also wie füge ich nach dem Parsen neue Elemente an die gewünschte Stelle im XML-FIle.

Entschuldige falls ich mich dumm anstelle 😉

Grüße
Nico
 
kannst du das genauer fassen? welche Code-Zeilen verwendest du dafür, zuletzt gepostest willst du in rootElement etwas einfügen, obwohl rootElement noch nichts vom doc weiß, wohl null ist
--> Ich möchte das Root-Element des schon bestehen Docs behalten und diesem neue Kindselemente hinzufügen. Hier weiss ich leider nicht wie.

welche Code-Zeilen, rootElement = doc.getRoot(); oder irgendwie sowas?
-->Beim erzeugen des Dokumentes hab ich das entsprechend so angelegt
Java:
Element rootElement = doc.createElement("Root");
            doc.appendChild(rootElement);

die Variable rootElement musst du mit dem root des neuen doc befüllen!
-->hier möchte ich ja alles was im vorherigen Dokument ist übernehmen und dem Root-Element neue Kind und Kindeskinder hinzufügen.
 
wie soll ich das weiter beschreiben, das eingelesene doc ist komplett ein anderes als das was zu vielleicht kurz zuvor geschrieben hast,
gleicher Inhalt, das mag sein, spielt aber keine Rolle

du musst mit dem neuen doc-Objekt arbeiten, nicht mit dem alten doc-Objekt,
weitgehend machst du es ja auch schon alles korrekt, nur zeigt die rootElement-Variable noch auf ein Element des alten doc

Getting the Root Element in a DOM Document | Example Depot
rootElement = doc.getDocumentElement();

mag reichen im if, nach
> doc = docBuilder.parse(file);
oder nach der nächsten Zeile, was immer die da anscheinend genau mit dem root anstellt
 
du musst mit dem neuen doc-Objekt arbeiten
--> das war der entscheidende Hinweis 😉

Vielen Dank für deine Hilfe 😉 so läuft es jetzt

Java:
if (file.exists()){
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder;
            docBuilder = docFactory.newDocumentBuilder();
            Document doc;
            doc = docBuilder.parse(file);
            doc.getDocumentElement().normalize();
            Element rootElement = doc.getDocumentElement();
   
            Element ConfigurationItem = doc.createElement ("ConfigurationItem");
            rootElement.appendChild(ConfigurationItem);
...
 

Zurück
Oben