2013-04-24 2 views
0

나는 객체를 XML로 변환하기 위해 캐스터 API를 사용하고 있습니다. org.xml.sax.SAXException :캐스터 (castor) 마샬링 :: 유효하지 않은 XML 문자

나는 다음과 같은 예외를에 의한

얻을 문자를 ''잘못된 XML 문자입니다.

올바른 방법은 원본을 수정하는 것이지만 잘못된 문자가 많이 있다는 것을 알고 있습니다.

다른 포럼에서는 누군가 마샬링하기 전에 자바 객체 내용을 인코딩 한 다음 출력 (Base64)을 해독 할 것을 제안했습니다. 접근법은 꽤 복잡하고 솔루션을 적절하게 맞추지 못합니다.

마샬링 중에 이러한 문자를 건너 뛰는 방법이 필요하며 생성 된 XML에는 그대로 문자가 들어 있어야합니다. 당신이

은 다음 XML 1.1 사양 도움이 될 것입니다으로

문자의 종류를 포함하는 XML을 생성하려면

+0

조금 더 파고 들자 잘못된 문자가 백 스페이스 (ASCII 코드 = 8)에 불과하다는 것을 알았습니다. 백 스페이스 문자가 문자열에 어떻게 삽입되었는지 이상합니다. 제안 사항이 있으십니까? – Taran

+0

자바 객체를 마샬링하기 전에 내용을 인코딩하고 언 마샬링 후에 디코딩하십시오. 이것은 이것을 해결할 수있는 유일한 방법 인 것 같습니다. marshal.setEncoding ("base64"); 사용 된 base 64 인코딩 및 디코딩. – constantlearner

+0

바이너리 데이터가 아니기 때문에 base64를 사용하는 것이 적절하지 않다고 생각합니다. 아래 답변은 도움이됩니다. 감사. – Taran

답변

0
/** 
    * 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(); 
    } 
0

. 캐스터는 정의와 XML 1.1에 org.exolab.castor.xml.XMLSerializerFactoryorg.exolab.castor.xml.Serializer 구현을 마샬링하는 구성 할 수 있습니다

package com.foo.castor; 
...... 

import org.exolab.castor.xml.BaseXercesOutputFormat; 
import org.exolab.castor.xml.Serializer; 
import org.exolab.castor.xml.XMLSerializerFactory; 
import org.xml.sax.DocumentHandler; 

import com.sun.org.apache.xml.internal.serialize.OutputFormat; 
import com.sun.org.apache.xml.internal.serialize.XML11Serializer; 

@SuppressWarnings("deprecation") 
public class CastorXml11SerializerFactory implements XMLSerializerFactory { 

    private static class CastorXml11OutputFormat extends BaseXercesOutputFormat{ 

     public CastorXml11OutputFormat(){ 
      super._outputFormat = new OutputFormat(); 
     } 
    } 

    private static class CastorXml11Serializer implements Serializer { 

     private XML11Serializer serializer = new XML11Serializer(); 

     @Override 
     public void setOutputCharStream(Writer out) { 
      serializer.setOutputCharStream(out); 
     } 

     @Override 
     public DocumentHandler asDocumentHandler() throws IOException { 
      return serializer.asDocumentHandler(); 
     } 

     @Override 
     public void setOutputFormat(org.exolab.castor.xml.OutputFormat format) { 
      serializer.setOutputFormat((OutputFormat)format.getFormat()); 
     } 

     @Override 
     public void setOutputByteStream(OutputStream output) { 
      serializer.setOutputByteStream(output); 
     } 

    } 

    @Override 
    public Serializer getSerializer() { 
     return new CastorXml11Serializer(); 
    } 

    @Override 
    public org.exolab.castor.xml.OutputFormat getOutputFormat() { 
     return new CastorXml11OutputFormat(); 
    } 

} 

세계적 파일

org.exolab.castor.xml.serializer.factory=com.foo.castor.CastorXml11SerializerFactory 
org.exolab.castor.xml.version=1.1 

또는 CastorMarshaller 특정의 setCastorProperties 방법으로이 두 가지 속성을 설정 castor.properties에.

그러나 XML 1.1 is not accepted by browsersnot all XML parsers can parse XML 1.1 out of the box입니다.

관련 문제