Search code examples
javaxmlmarshallingcastor

Castor Marshaling :: Invalid XML Character


I am using castor API for converting an object to XML.

I get the following exception

Caused by: org.xml.sax.SAXException: The character '' is an invalid XML character.

I know the correct approach is to correct the source but there are a lot of such invalid characters.

In another forum, someone suggested to encode the java object contents before marshaling them and then decode the output (Base64). The approach appears pretty cumbersome and does not fit the solution properly.

I need a way to skip these characters during marshaling and the XML generated should contain the characters as it is.


Solution

  •  /**
         * This method ensures that the output String has only
         * valid XML unicode characters as specified by the
         * XML 1.0 standard. For reference, please see
         * <a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char">the
         * standard</a>. This method will return an empty
         * String if the input is null or empty.
         *
         * @param in The String whose non-valid characters we want to remove.
         * @return The in String, stripped of non-valid characters.
         */
        public String stripNonValidXMLCharacters(String in) {
            StringBuffer out = new StringBuffer(); // Used to hold the output.
            char current; // Used to reference the current character.
    
            if (in == null || ("".equals(in))) return ""; // vacancy test.
            for (int i = 0; i < in.length(); i++) {
                current = in.charAt(i); // NOTE: No IndexOutOfBoundsException caught here; it should not happen.
                if ((current == 0x9) ||
                    (current == 0xA) ||
                    (current == 0xD) ||
                    ((current >= 0x20) && (current <= 0xD7FF)) ||
                    ((current >= 0xE000) && (current <= 0xFFFD)) ||
                    ((current >= 0x10000) && (current <= 0x10FFFF)))
                    out.append(current);
            }
            return out.toString();
        }