2010-10-04 40 views
3

我试图在说明字段内创建CDATA部分,但失败。代码非常简单,但是在生成的XML中没有出现CDATA部分!创建CDATA部分令人困惑

Node de = document.createElement("description"); 
de.appendChild(document.createCDATASection(reportData.getIssue().getDescription() + "more]]>data")); 
e.appendChild(de); 

在结果XML,我得到:

<description>Room #1128 has AD issues.more]]&gt;data</description> 

我在做什么错?

+0

你为什么要在文本中放置']]>? 'createCDATASection'当然也会生成它? – Oded 2010-10-04 19:08:16

+0

没关系!我想在结果XML中看到CDATA,它在哪里? – 2010-10-04 22:52:44

回答

6

序列]]>结束CDATA节,因此CDATA部分中不能出现。

您的XML库通过放弃CDATA节并使用具有特殊含义的字符实体进行恢复。

因为<foo><![CDATA[Hello, world>]]></foo><foo>Hello, world&gt;</foo>是等价的,所以这不是问题(除非有人试图用不是XML解析器的工具解析生成的XML,这种方式是疯狂的)。

+0

所以,你说DOM4j足够聪明,以找出这种情况下不需要的CDATA部分? – 2010-10-04 22:54:47

+0

没有那么多“不需要”作为“无效”。 – Quentin 2010-10-05 06:10:04

+0

我不会称之为“无效”。如果CDATA中的字符串包含“]]>”,则适当的CDATA实现应该将字符串分为两个CDATA节。 – jasso 2010-10-05 12:47:22

0

您不能在XML数据中编写>
它被转义成&gt;(大于)

注意,大于标志会搞乱你的</description>标记,因为结束标记它的开始。

你可以阅读一下here(其他地方)

+0

我认为我的案例具体实现,我的观点是如果我要求创建CDATA部分,为什么它不是在生成的XML? – 2010-10-04 22:55:42

2

使用下面的方法:

CDATASection cdata = document.createCDATASection(""); 
4

应指定CDATA段件(S)。

你可以这样做;

transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "tagName"); 

如果要指定多个CDATA节元素,请使用空格作为分隔符。

transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "tagName1 tagName2"); 

全码

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 

Document doc = docBuilder.newDocument(); 
Element rootElement = doc.createElement("catalog"); 
doc.appendChild(rootElement); 

Element description = doc.createElement("description"); 
description.appendChild(doc.createCDATASection("/&(*/**SOME STRANGE DESCRIPTION**ĞĞÜ656*9/*9^+%3ÜĞPÜ")); 
rootElement.appendChild(description); 

Element books = doc.createElement("books"); 
rootElement.appendChild(books); 

Element book = doc.createElement("book"); 
books.appendChild(book); 

Element author = doc.createElement("author"); 
author.appendChild(doc.createCDATASection("&/(&/(QNzxB5yiBibGj2MM ÇÖÇÇ")); 
book.appendChild(author); 

Element price = doc.createElement("price"); 
price.appendChild(doc.createTextNode("50.5")); 
book.appendChild(price); 

Element title = doc.createElement("title"); 
title.appendChild(doc.createTextNode("my book title")); 
book.appendChild(title); 

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "description author descr"); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

DOMSource source = new DOMSource(doc); 

StreamResult result = new StreamResult(System.out); 

transformer.transform(source, result); 

结果会是这样;

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <description><![CDATA[/&(*/**SOME STRANGE DESCRIPTION**ĞĞÜ656*9/*9^+%3ÜĞPÜ]]></description> 
    <books> 
     <book> 
     <author><![CDATA[&/(&/(QNzxB5yiBibGj2MM ÇÖÇÇ]]></author> 
     <price>50.5</price> 
     <title>my book title</title> 
     </book> 
    </books> 
</catalog> 

如果我们想申请你确切的样品(与您的数据+ “]”);

String someInfo = "example-info"; 
Element dscr = doc.createElement("descr"); 
dscr.appendChild(doc.createCDATASection(someInfo + "more]]>data")); 
book.appendChild(dscr); 

然后结果会是这样;

<?xml version="1.0" encoding="UTF-8"?> 
    <catalog> 
     <description><![CDATA[/&(*/**SOME STRANGE DESCRIPTION**ĞĞÜ656*9/*9^+%3ÜĞPÜ]]></description> 
     <books> 
      <book> 
      <author><![CDATA[&/(&/(QNzxB5yiBibGj2MM ÇÖÇÇ]]></author> 
      <price>50.5</price> 
      <title>my book title</title> 
      <descr><![CDATA[example-infomore]]]]><![CDATA[>data]]></descr> 
      </book> 
     </books> 
    </catalog>