Frage

Ich möchte einen Text schreiben, die Leerzeichen wie newline und tab in eine XML-Datei enthält so verwende ich

Element element = xmldoc.createElement("TestElement");
element.appendChild(xmldoc.createCDATASection(somestring));

aber wenn ich lesen Sie diese zurück in mit

Node vs =  xmldoc.getElementsByTagName("TestElement").item(0);
String x = vs.getFirstChild().getNodeValue();

Ich erhalte eine Zeichenfolge, die keine Zeilenumbrüche mehr hat.
Wenn ich auf der Festplatte suchen direkt in die xml, scheinen die Zeilenumbrüche erhalten. so dass das Problem tritt auf, wenn in der XML-Datei zu lesen.

Wie kann ich die Zeilenumbrüche erhalten?

Danke!

War es hilfreich?

Lösung

Ich weiß nicht, wie Sie analysieren und Ihr Dokument schreiben, aber hier ist ein erweitertes Codebeispiel basiert auf Ihnen:

// creating the document in-memory                                                        
Document xmldoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

Element element = xmldoc.createElement("TestElement");                                    
xmldoc.appendChild(element);                                                              
element.appendChild(xmldoc.createCDATASection("first line\nsecond line\n"));              

// serializing the xml to a string                                                        
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();             

DOMImplementationLS impl =                                                                
    (DOMImplementationLS)registry.getDOMImplementation("LS");                             

LSSerializer writer = impl.createLSSerializer();                                          
String str = writer.writeToString(xmldoc);                                                

// printing the xml for verification of whitespace in cdata                               
System.out.println("--- XML ---");                                                        
System.out.println(str);                                                                  

// de-serializing the xml from the string                                                 
final Charset charset = Charset.forName("utf-16");                                        
final ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes(charset));       
Document xmldoc2 = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input);

Node vs =  xmldoc2.getElementsByTagName("TestElement").item(0);                           
final Node child = vs.getFirstChild();                                                    
String x = child.getNodeValue();                                                          

// print the value, yay!                                                                  
System.out.println("--- Node Text ---");                                                  
System.out.println(x);                                                                    

Die Serialisierung LSSerializer mit der W3C Art und Weise, es zu tun ( siehe hier ). Der Ausgang wird wie erwartet, mit Zeilenseparatoren:

--- XML --- 
<?xml version="1.0" encoding="UTF-16"?>
<TestElement><![CDATA[first line
second line ]]></TestElement>
--- Node Text --- 
first line
second line

Andere Tipps

Sie müssen den Typ jedes Knotens mit node.getNodeType () überprüfen. Wenn der Typ CDATA_SECTION_NODE ist, müssen Sie die CDATA Wachen node.getNodeValue verketten.

Sie müssen nicht unbedingt CDATA verwenden Leerzeichen zu bewahren. Die XML- Spezifikation angeben, wie diese Zeichen zu kodieren.

So zum Beispiel, wenn Sie ein Element mit Wert haben, die neuen Raum enthält, sollten Sie sie kodieren mit

  &#xA;

Carriage Return:

 &#xD;

Und so weiter

EDIT: schneiden alle irrelevanten Sachen

Ich bin neugierig zu wissen, was DOM-Implementierung Sie verwenden, weil es nicht in ein paar JVMs das Standardverhalten des einen ist der Spiegel habe ich versucht (sie mit einem Xerces impl versenden). Ich bin auch daran interessiert, was Zeilenumbrüche Ihr Dokument hat.

Ich bin mir nicht sicher, ob ob CDATA Leerzeichen ein gegebener bewahren sollte. Ich vermute, dass es viele Faktoren beteiligt. Nicht DTDs / Schemas beeinflussen, wie Leerzeichen verarbeitet wird?

Sie könnten versuchen, die XML verwenden: space = "preserve" Attribut

.

xml: space = 'bewahren' ist es nicht. Das ist nur für „alle Leerzeichen“ Knoten. Das heißt, wenn Sie die Leer Knoten in möchten

<this xml:space='preserve'> <has/>
<whitespace/>
</this>

Aber sehen, dass diese Leer Knoten nur Leerzeichen sind.

Ich habe zu kämpfen Xerces zu bekommen Ereignisse zu erzeugen, von CDATA Inhalt als auch ermöglicht Isolation. Ich habe keine Lösung noch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top