Gå til innhold

[Løst] Problemer med lesing av XML etter skriving til samme fil


Anbefalte innlegg

Jeg sitter å lager et system for å redigere på en xml-fil og har støtt på et problem ved skriving og lesing.

Alt av filbehandling foregår vi servlet.

Kort forløpsbeskrivelse:

- når siden åpnes tar jeg en kopi av den opprinnelige filen for å bruke til redigering

- en meny lages ut fra xmlen, der hver node gir mulighet til å redigere på et element i xmlfilen

- ved første redigering og lagring av en node fungerer alt fint, problemet oppstår etter lagring når jeg skal lese fra den samme filen som jeg akkurat har lagret til. Når jeg vil ha ut informasjonen får jeg en tom string tilbake.

 

Problemet uteblir hvis jeg bare klikker meg rundt i menyen, det oppstår kun etter at jeg har lagret en gang. Legger ved funksjonen som lagrer til fil under ettersom det mest sannsynlig er der det er gjort noe feil eller mangler noe.

 

Noen som har tips?

 

public boolean UpdateDoc(String ID, String path, String title, String src, String infopub, String infotext, String frag_setup) throws FileNotFoundException {
File xmlFile = new File("/home/paul/workspace/DXPAdmin/WebContent/routes.bak.xml");
FileInputStream fin = new FileInputStream(xmlFile);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
try {
	docBuilder = factory.newDocumentBuilder();
	Document doc = docBuilder.parse(fin);
	Element root = doc.getDocumentElement();
	NodeList docs = root.getElementsByTagName("doc");
	for(int i = 0; i < docs.getLength(); i++) {
		Element d = (Element)docs.item(i);
		Attr p = d.getAttributeNode("path");
		if(p.getNodeValue().equals(ID)) {
			p.setNodeValue(path);
			Attr t = d.getAttributeNode("title");
			t.setNodeValue(title);
			Attr s = d.getAttributeNode("src");
			s.setNodeValue(src);
			Element info = (Element)(d.getElementsByTagName("info")).item(0);
			Attr infop = info.getAttributeNode("pubdate");
			infop.setNodeValue(infopub);
			Node infot = (Node)info;
			infot.setTextContent(infotext);
			Element frag = (Element)(d.getElementsByTagName("fragment")).item(0);
			Attr frags = frag.getAttributeNode("setup");
			frags.setNodeValue(frag_setup);
			break;
		}
	}

    TransformerFactory transfac = TransformerFactory.newInstance();
    Transformer trans = transfac.newTransformer();

    StringWriter sw = new StringWriter();
    StreamResult result = new StreamResult(sw);
    DOMSource source = new DOMSource(doc);
    trans.transform(source, result);
    String xmlString = sw.toString();

       OutputStream f0;
   	byte buf[] = xmlString.getBytes();
   	f0 = new FileOutputStream("/home/paul/workspace/DXPAdmin/WebContent/routes.bak.xml");
   	for(int i=0;i<buf .length;i++) {
   	   f0.write(buf[i]);
   	}
   	fin.close();
   	f0.flush();
   	f0.close();
   	buf = null;
   	return true;

} catch (ParserConfigurationException e) {
	// TODO Errorhandling
	e.printStackTrace();
	return false;
} catch (SAXException e) {
	e.printStackTrace();
	return false;
} catch (IOException e) {
	e.printStackTrace();
	return false;
} catch (TransformerConfigurationException e) {
	e.printStackTrace();
	return false;
} catch (TransformerException e) {
	e.printStackTrace();
	return false;
}
}

Lenke til kommentar
Videoannonse
Annonse

Det løser nok ikke problemet ditt, men som et tips ville jeg kalt close() på streams i finally blokker. Hvis du får en exception på f.eks trans.transform(source, result) eller f0.write(buf) så blir ikke fin og f0 lukket.

 

fin.close() kan med fordel kalles før du åpner en writer på samme fil.

 

Jeg ville hatt en try/catch/finally for å lese filen og en try/catch/finally for å skrive til den.

Lenke til kommentar

Det løser nok ikke problemet ditt, men som et tips ville jeg kalt close() på streams i finally blokker. Hvis du får en exception på f.eks trans.transform(source, result) eller f0.write(buf) så blir ikke fin og f0 lukket.

 

fin.close() kan med fordel kalles før du åpner en writer på samme fil.

 

Jeg ville hatt en try/catch/finally for å lese filen og en try/catch/finally for å skrive til den.

 

Takk for tips, det er iallefall verdt et forsøk.

Jeg har kjørt på med finally på skriving tidligere, men ikke ved lesing.

Endret av Lunde84
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...