Создание раздела CDATA сбивает с толку - PullRequest
3 голосов
/ 04 октября 2010

Я пытаюсь создать раздел CDATA в поле описания, но не удается. Код довольно прост, но в результирующем XML раздел 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>

Что я делаю не так?!

Ответы [ 4 ]

6 голосов
/ 04 октября 2010

Последовательность ]]> завершает раздел CDATA и поэтому не может появляться в разделе CDATA.

Ваша библиотека XML восстанавливается, отключив раздел CDATA и используя сущности для символов, которые будут иметь особое значение.

Поскольку <foo><![CDATA[Hello, world>]]></foo> и <foo>Hello, world&gt;</foo> эквивалентны, это не проблема (если кто-то не попытается проанализировать полученный XML с помощью инструмента, который не является XML-анализатором, что является безумием).

5 голосов
/ 05 апреля 2013

Вы должны указать элементы раздела CDATA.

Вы можете сделать это так;

 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>
2 голосов
/ 11 апреля 2011

Используйте метод ниже:

CDATASection cdata = document.createCDATASection("");
0 голосов
/ 04 октября 2010

Вы не можете написать > в XML-данных.
Он экранируется в &gt; (больше чем)

Обратите внимание, что знак Больше будетиспортите ваш </description> тег, потому что это начало конечного тега.

Вы можете прочитать об этом здесь (среди других мест)

...