Wie Zeilenumbrüche in CDATA zu erhalten, wenn Generierung von XML?
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!
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


Carriage Return:

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.