Dopisywanie do pliku XML

0

Witam,

Mam problem z dopisywaniem danych do końca pliku XML.
Tworze najpierw plik .xml, dodaję jego właściwości, a przy każdym następnym jego użyciu chciałbym wprowadzać już tylko kolejne dane.
jednak w tym drugim przypadku, po pierwsze zawsze dopisuje się <?xml ?>, a dane są zapisywane w jednej linii (nie tworzą struktury drzewiastej)

try {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document doc = builder.newDocument();

   Element rootElement = doc.createElement("pracownicy");
   Element childElement = doc.createElement("pracownik");
   Element grandChildElement = doc.createElement("imie");
   Element grandChildElement2 = doc.createElement("nazwisko");

   doc.appendChild(rootElement);
   rootElement.appendChild(childElement);
   childElement.appendChild(grandChildElement);
   childElement.appendChild(grandChildElement2);
   
   grandChildElement.setTextContent(imie);
   grandChildElement2.setTextContent(nazwisko);
   
   File f = new File("plik.xml");
   TransformerFactory fabrykaTransformacji = TransformerFactory.newInstance();
   Transformer t = fabrykaTransformacji.newTransformer();
   DOMSource domSource = new DOMSource(doc);
   
   if (!f.exists()) {
      t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
         "http://www.w3.org/TR/2000/CR-SVG-20000802/DTD/svg-20000802.dtd");
      t.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//W3C//DTD SVG 20000802//EN");
      t.setOutputProperty(OutputKeys.INDENT, "yes");
      t.setOutputProperty(OutputKeys.METHOD, "xml");
      t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
      t.transform(domSource, new StreamResult(new FileOutputStream(f)));
   }
   else {
      t.transform(domSource, new StreamResult(new FileOutputStream(f, true)));
   }
}
catch (ParserConfigurationException ex) {
   System.out.println(ex);
}
catch (TransformerConfigurationException ex) {
   System.out.println(ex);
}
catch (TransformerException ex) {
   System.out.println(ex);
}
catch (FileNotFoundException ex) {
   System.out.println(ex);
}
0

Jest to prawidłowe zachowanie. Odczytaj ustawienia Transformera za pomocą metody getProperties() i zobacz czy można to zmienić.

0

Co do drugiego problemu to masz tutaj przyklad: http://faq.javaranch.com/java/HowToPrettyPrintXmlWithJava
Dopisywanie preambuly xml - jak juz jedna jest, to zawsze dopisuje Ci kolejna? Ze p 5 zapisach masz 5 razy <?xml ... ?>?

0

dokładnie tak.

Poza tym mam jeszcze pytanie... czy dopisywanie do końca pliku XML ma w ogole sens?
Np stworzyłem plik.xml o zawartości:

<pracownicy>
   <pracownik>
      <imie>Jan</imie>
      <nazwisko>Kowalski</nazwisko>
   </pracownik>
</pracownicy>

i OK, ale później chciałbym do plik.xml dodać kolejnego pracownika. Przecież będę musiał go umieścić w głównym korzeniu "pracownicy". Dopisywanie do końca na nic mi się nie przyda...
Muszę wczytać najpierw zawartość pliku, w odpowiednie miejsce dodać kolejnego pracownika i dopiero zapisać całość?

0

XML musi miec 1 roota, wiec jest tak jak mowisz - czyli nie ma to sensu i jest niedozwolone. Ogolnie mozesz to zrobic najlatwiej np. wczytujac xml do struktury DOM, i pozniej majac takie drzewo do odpowiednich elementow dodawac nowe, i na koncu nadpisac stary plik XML tym nowym. Jesl XML jest tak olbrzymi ze nie chcesz go calego wczytywac / zapisywac to musisz poczytac np o SAX (podejrzewam ze w Twoim przypadku poki co nie jest to potrzebne).

0

dziękuje za wskazówki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1