JAXB маршалинг и демаршаллинг CDATA - PullRequest
2 голосов
/ 24 сентября 2011

У меня есть требование, в котором у меня есть XML, как это

<programs>
   <program>
      <name>test1</name>
      <instr><![CDATA[ some string ]]></instr>
   </program>
   <program>
      <name>test2</name> 
      <instr><![CDATA[ some string ]]></instr>
   </program>
</programs>

Моя программа должна разархивировать это в JAXB, выполнить некоторую обработку и, наконец, вернуться в xml. Когда я, наконец, маршаллизирую объекты JAXB в xml, я получаю простой текст без префикса CDATA. Но чтобы сохранить XML нетронутым, мне нужно вернуть XML с префиксом CDATA. Кажется, JAXB не поддерживает это напрямую. Есть ли способ добиться этого?

Ответы [ 3 ]

1 голос
/ 01 февраля 2013

У меня тоже была такая же проблема и при поиске в SO я нашел этот пост. Поскольку я генерирую свои bean-компоненты с помощью xjc, я не хотел добавлять @XmlCData в сгенерированный код.

Поработав некоторое время над хорошим решением, я наконец нашел этот пост: http://javacoalface.blogspot.pt/2012/09/outputting-cdata-sections-with-jaxb.html

Который содержит следующий пример кода:

DocumentBuilderFactory docBuilderFactory = 
DocumentBuilderFactory.newInstance();
Document document = 
docBuilderFactory.newDocumentBuilder().newDocument();

// Marshall the feed object into the empty document.
jaxbMarshaller.marshal(jaxbObject, document);

// Transform the DOM to the output stream
// TransformerFactory is not thread-safe
StringWriter writer = new StringWriter();
TransformerFactory transformerFactory = 
TransformerFactory.newInstance();
Transformer nullTransformer = transformerFactory.newTransformer();
nullTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
nullTransformer.setOutputProperty(
OutputKeys.CDATA_SECTION_ELEMENTS,
 "myElement myOtherElement");
nullTransformer.transform(new DOMSource(document),
 new StreamResult(writer));

Для меня это работает довольно хорошо. Надеюсь, это поможет другим, которые попадают на эту страницу, ищут то же, что и я.

1 голос
/ 24 сентября 2011

CDATA или нет, это не должно быть проблемой, так как выход из JAXB будет экранирован при необходимости.

0 голосов
/ 24 сентября 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 ( JSR-222 )) экспертная группа.

Вы можете использовать расширение @XmlCDATA MOXy, чтобы принудительно обернуть текстовый узел CDATA:

package blog.cdata;

import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlCDATA;

@XmlRootElement(name="c")
public class Customer {

   private String bio;

   @XmlCDATA
   public void setBio(String bio) {
      this.bio = bio;
   }

   public String getBio() {
      return bio;
   }

}

Для получения дополнительной информации

...