DOM docoment schliesen

wako

Grünschnabel
hallo,

folgendes Problem bringt mich zum verzweifeln.

1.) ich habe eine XML file (logisch icon_smile.gif )
2.) ich parse sie mit DOM ( einwandfrei)
3.) habe in diese XML file folgende 2 TAGs ( neben vielen anderen, ist eigentlich ein InstallAnywhere Project file!)
a.) <string><![CDATA[]]></string>
b.) <string><![CDATA[${CS2HF_PACKED_DIR}]]></string>

bei b.) ersetzte ich das ${CS2HF_PACKED_DIR} durch einen String aus einer propertie file
--> klappt alles wunder bar.
--> PROBLEM: wenn ich nun das document schliesen will, d.h. alle änderungen in die XML file zurück schreiben
dann wird dies zwar gemacht, aber aus allen, im dokument vorkommenden, a.) wird aus
<string><![CDATA[]]></string> dass --> </string>

--> XML Dokument is nich mehr gültig. ich schliese das dokument mit

this.transformer.transform(source, result);

ansonsen wird alles richtig geschrieben, halt nur wenn so ein cdata-section element leer ist, mach der so ne scheise.

an was kann das liegen?

danke für eure hilfe.

gru wako
 
Hallo!

Versuchs mal damit:

Code:
/*
 * Created on 15.10.2004
 */
package de.tutorials;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
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.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author Darimont
 *  
 */
public class Test17 {

    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            File file = new File("c:/Xml.xml");

            Document doc = builder.parse(file);

            treeWalk(doc);

            Transformer transformer = TransformerFactory.newInstance()
                    .newTransformer();

            transformer.transform(new DOMSource(doc), new StreamResult(
                    new FileOutputStream(file)));

        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }

    public static void treeWalk(Node node) {
        if (node.hasChildNodes()) {
            NodeList list = node.getChildNodes();
            for (int i = 0; i < list.getLength(); i++) {
                treeWalk(list.item(i));
            }
        } else {
            if (node.getNodeType() == Node.CDATA_SECTION_NODE) {
                String val = node.getNodeValue();
                if (val.equals("")) {
                    node.setNodeValue("HalloWelt!");
                } else if (val.equals("$ABC")) {
                    node.setNodeValue("REPLACE_ABC$");
                }
                System.out.println(node.getNodeValue());
            }
        }
    }
}

XML.xml vor Aufruf...
Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
	<string><![CDATA[]]></string>
	<string><![CDATA[$ABC]]></string>
</root>

XML.xml nach Aufruf...
Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
	<string><![CDATA[HalloWelt!]]></string>
	<string><![CDATA[REPLACE_ABC$]]></string>
</root>

HTH Gruß Tom
 
sorry, das ersetzten von tag values und andere spielerein mit den nodes, attributen... bei mir alles supi.

aber lese bitte mal ein xml dokument ein und ohne etwas ändern
schreib einfach wieder alles zurück
bei mir wird dann aus <string><![CDATA[]]></string> --> </string>
und ich weis nicht wieso alles immer nur wenn die cdata section leer ist.

thx aber trotzdem
 
Hallo!

Du hast recht... leere CData Blocke werden beim zurückschrieben nicht wieder explizit geschrieben. Habe dazu aber auch die Begründung gefunden:
In der Klasse Document gibt es eine Methode Namens normalizeDocument().
void normalizeDocument()
This method acts as if the document was going through a save and load cycle, putting the document in a "normal" form.

Diese ruft von jedem Node im Document wieder selbst die normalize() Methode des jeweiligen Nodes auf.

Node:
void normalize
void normalize()Puts all Text nodes in the full depth of the sub-tree underneath this Node, including attribute nodes, into a "normal" form where only structure (e.g., elements, comments, processing instructions, CDATA sections, and entity references) separates Text nodes, i.e., there are neither adjacent Text nodes nor empty Text nodes. This can be used to ensure that the DOM view of a document is the same as if it were saved and re-loaded, and is useful when operations (such as XPointer [XPointer] lookups) that depend on a particular document tree structure are to be used. If the parameter "normalize-characters" of the DOMConfiguration object attached to the Node.ownerDocument is true, this method will also fully normalize the characters of the Text nodes.
Note: In cases where the document contains CDATASections, the normalize operation alone may not be sufficient, since XPointers do not differentiate between Text nodes and CDATASection nodes

Alternative:
Schreib doch einfach ein Leerzeichen in den CData Block...

HTH
Gruß Tom
 
he tom,

danke für deine mühe. hab auch schon leerzeichen rein geschrieben, dann wird die cdata section zwar nicht gelöscht, aber wenn ich dann installanywhere aufrufe und das projekt laden will, für dieses leerzeichen zu einem fehler in meinem projekt...naja, hab leider auch nix gefunden womit man einstellen könnte, das leere cdata sections stehen bleiben...naja. weis ich wies mit xercis oder jdom ist...aber machs halt jetzt über buffered reader/writer :-)

thx nochmal

gruß wako
 
Zurück