---
title: 'Snippet: JAXB and CDATA ContentHandler with CharacterEscapeHandler'
url: 'https://tutego.de/blog/javainsel/2019/11/snippet-jaxb-and-cdata-contenthandler-with-characterescapehandler'
markdown: 'https://tutego.de/blog/javainsel/2019/11/snippet-jaxb-and-cdata-contenthandler-with-characterescapehandler.md'
date: '2019-11-28'
description: 'Main program: package com.tutego.jaxb; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import java.io.PrintWriter; public class App { public static void main( String[] args ) throws Exception { Dog dog = new Dog(); dog.name = "Wüffi"; Flea flea = new Flea(); …'
taxonomy:
  category:
    - Snippet
---

# Snippet: JAXB and CDATA ContentHandler with CharacterEscapeHandler

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://tutego.de/blog/javainsel/)

## Snippet: JAXB and CDATA ContentHandler with CharacterEscapeHandler

28.11.2019 · [Christian Ullenboom](https://tutego.de/blog/javainsel/author/admin/)

Main program:

```java
package com.tutego.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.PrintWriter;

public class App {
  public static void main( String[] args ) throws Exception {
    Dog dog = new Dog();
    dog.name = "Wüffi";
    Flea flea = new Flea();
    flea.name = " Böser Floh ";
    dog.flea = flea;

    JAXBContext jaxbContext = JAXBContext.newInstance( dog.getClass() );
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
    jaxbMarshaller.marshal( dog, new CDATAContentHandler( new PrintWriter( System.out ) ) );
  }
}
```

`Dog` and `Flea`:

```java

package com.tutego.jaxb;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Dog {
  public String name;
  public Flea flea;
}

class Flea {
  public String name;
}
```

`CDATAContentHandler`:

```java

package com.tutego.jaxb;

import com.sun.xml.txw2.output.CharacterEscapeHandler;
import com.sun.xml.txw2.output.DataWriter;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.Writer;

public class CDATAContentHandler extends DataWriter {
  public CDATAContentHandler( Writer writer ) {
    super( writer, "UTF-8", MinimumEscapeHandler.theInstance );
  }

  @Override
  public void characters( char[] ch, int start, int length ) throws SAXException {
    boolean useCData = false;

    loop:
    for ( int i = start; i < start + length; i++ )
      switch ( ch[ i ] ) {
        case '': case '&': useCData = true;
        break loop;
      }

    if ( useCData ) super.startCDATA();
    super.characters( ch, start, length );
    if ( useCData ) super.endCDATA();
  }
}

/**
 * Performs no character escaping. Usable only when the output encoding
 * is UTF, but this handler gives the maximum performance.
 *
 * @author Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
 */
class MinimumEscapeHandler implements CharacterEscapeHandler {

  private MinimumEscapeHandler() {
  }  // no instanciation please

  public static final CharacterEscapeHandler theInstance = new MinimumEscapeHandler();

  public void escape( char[] ch, int start, int length, boolean isAttVal, Writer out )
      throws IOException {
    // avoid calling the Writerwrite method too much by assuming
    // that the escaping occurs rarely.
    // profiling revealed that this is faster than the naive code.
    int limit = start + length;
    for ( int i = start; i < limit; i++ ) {
      char c = ch[ i ];
      if ( c == '&' || c == '' || c == '\r' || (c == '\n' && isAttVal) || (c == '\"' && isAttVal) ) {
        if ( i != start )
          out.write( ch, start, i - start );
        start = i + 1;
        switch ( ch[ i ] ) {
          case '&':
            out.write( "&amp;" );
            break;
          case '':
            out.write( "&gt;" );
            break;
          case '\"':
            out.write( "&quot;" );
            break;
          case '\n':
          case '\r':
            out.write( "&#" );
            out.write( Integer.toString( c ) );
            out.write( ';' );
            break;
          default:
            throw new IllegalArgumentException( "Cannot escape: '" + c + "'" );
        }
      }
    }

    if ( start != limit )
      out.write( ch, start, limit - start );
  }
}
```

Kategorien: [Snippet](https://tutego.de/blog/javainsel/category/snippet/)

## 1 Kommentare

**\[Solved\] PropertyException after wildfly update: property CharacterEscapeHandler must be an instance of type CharacterEscapeHandler – Ten-tools.com** · [12.11.2022 03:56](#comment-1083571)

\\\[…\\\] must be an instance of type CharacterEscapeHandler Some time ago I implemented a CustomCharacterEscapeHandler and it worked fine up-to Wildfly-18.0.1. Now when updating to Wildfly 19 or higher I get the \\\[…\\\]

Die bisherigen Kommentare wurden aus WordPress übernommen. Neue Kommentare sind derzeit geschlossen.

[← Alle Beiträge](https://tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Visual Studio Code bekommt ein Java-Update](https://tutego.de/blog/javainsel/2019/11/visual-studio-code-bekommt-ein-java-update.md)
- Next: [Maven 3.6.3 freigegeben](https://tutego.de/blog/javainsel/2019/11/maven-3-6-3-freigegeben.md)
