如何在生成XML时保留CDATA中的换行符?

我想写一些包含空格字符的文本,如newlinetab到xml文件中,所以我使用

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

但是当我在使用中读回来的时候

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

我得到一个没有新行的字符串了。
当我直接查看磁盘上的xml时,新行似乎得以保留。 所以在读取xml文件时会出现问题。

我该如何保留换行符?

谢谢!

我不知道你如何解析和编写你的文档,但这是一个基于你的增强代码示例:

 // 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); 

使用LSSerializer进行序列化是W3C的方法( 参见此处 )。 输出是预期的,带有行分隔符:

 --- XML ---   --- Node Text --- first line second line 

您需要使用node.getNodeType()检查每个节点的类型。 如果类型为CDATA_SECTION_NODE,则需要将CDATA保护连接到node.getNodeValue。

您不一定要使用CDATA来保留空白字符。 XML 规范指定了如何编码这些字符。

因此,例如,如果您有一个包含新空间值的元素,则应使用它进行编码

  
 

回程:

  
 

等等

编辑:削减所有不相关的东西

我很想知道你正在使用什么DOM实现,因为它没有镜像我尝试过的几个JVM中的默认行为(它们带有Xerces impl)。 我也对你的文档有哪些换行符感兴趣。

我不确定CDATA是否应该保留空格是给定的。 我怀疑涉及很多因素。 DTD /模式不会影响如何处理空格吗?

您可以尝试使用xml:space =“preserve”属性。

xml:space =’preserve’不是它。 这仅适用于“所有空白”节点。 也就是说,如果你想要空白节点

     

但是看到那些空白节点只有空格。

我一直在努力让Xerces生成允许隔离CDATA内容的事件。 我还没有解决方案。