2009-08-01 235 views
6

我想写包含空格字符,如newlinetab到一个XML文件,所以我用如何在生成XML时保留CDATA中的换行符?

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

但是当我在使用

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

读这回我得到一个字符串的一些文字没有换行符了。
当我直接看到磁盘上的XML,新行似乎保留。所以在xml文件中读取时会发生问题。

我该如何保留换行符?

谢谢!

+2

你能发布一个更完整的代码示例吗? – skaffman 2009-08-01 16:03:10

+0

它是一个元素。我会尽快发布更多代码。 – clamp 2009-08-01 16:06:26

+0

当你得到'x'的值时,它相当于'somestring'减去换行符? – akf 2009-08-01 16:19:22

回答

5

我不不知道如何解析和编写文档,但以下是基于您的文档的增强代码示例:

// 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的方法(see here)。输出如预期的那样,使用行分隔符:

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

编辑:切断所有不相干的东西

我很好奇,想知道你正在使用的DOM实现,因为它不反映一个的默认行为在一对夫妇的JVM我已经试过(他们用Xerces impl发货)。我也对你的文档有哪些换行符有兴趣。

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

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

2

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

2

您不一定非得使用CDATA来保留空格字符。 XML specification指定如何编码这些字符。

因此,举例来说,如果你有一个元素将包含新的空间价值,你应该

&#xA; 

回车进行编码:

&#xD; 

如此反复

0

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

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

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

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

相关问题