2011-12-14 2 views
2

XStream을 사용하여 파일의 사용자 객체를 저장하고 있습니다. 의 요소 내용에서 발견되었다 : (0x1a 유니 코드) : com.thoughtworks.xstream.io.StreamException : 유효하지 않은 XML 문자 StreamException : 잘못된 XML 문자 (유니 코드 : 0x1a)

private void store() { 
    XStream xStream = new XStream(new DomDriver("UTF-8")); 
    xStream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES); 

    xStream.alias("configuration", Configuration.class); 
    xStream.alias("user", User.class); 

    synchronized (ConfigurationDAOImpl.class) { 
     try { 
      xStream.toXML(configuration, new FileOutputStream(filename.getFile())); 
     } catch (IOException e) { 
      throw new RuntimeException("Failed to write to " + filename, e); 
     } 
    } 
} 

는 내가 예외가 다음과 같은 코드를 읽을하려고 할 때 문서.

private void lazyLoad() { 
    synchronized (ConfigurationDAOImpl.class) { 
     // Has the configuration been loaded 
     if (configuration == null) { 
      if (filename.exists()) { 
       try { 
        XStream xStream = new XStream(new DomDriver("UTF-8")); 
        xStream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES); 

        xStream.alias("configuration", Configuration.class); 
        xStream.alias("user", User.class); 

        configuration = (Configuration) xStream 
          .fromXML(filename.getInputStream()); 

        LOGGER.debug("Loaded configuration from {}.", filename); 
       } catch (Exception e) { 
        LOGGER.error("Failed to load configuration.", e); 
       } 
      } else { 
       LOGGER.debug("{} does not exist.", filename); 
       LOGGER.debug("Creating blank configuration."); 

       configuration = new Configuration(); 
       configuration.setUsers(new ArrayList<User>()); 

       // and store it 
       store(); 
      } 
     } 
    } 
} 

어떤 아이디어가 있습니까?

+0

아마 관련 다음 해 http://stackoverflow.com/a/8427929/486504 –

답변

4

내가 대시 문자 ('-')으로 0x1a를 대체 다음과 같은 방법으로 :

/** 
* This method ensures that the output String has only 
* @param in the string that has a non valid character. 
* @return the string that is stripped of the non-valid character 
*/ 
private String stripNonValidXMLCharacters(String in) {  
    if (in == null || ("".equals(in))) return null; 
    StringBuffer out = new StringBuffer(in); 
    for (int i = 0; i < out.length(); i++) { 
     if(out.charAt(i) == 0x1a) { 
      out.setCharAt(i, '-'); 
     } 
    } 
    return out.toString(); 
} 
+8

당신은 정답으로 jontros 대답을 받아 들였어야했다, 그는 당신의 질문에 대답하고 좋은 설명을 주었다. – SamStephens

+0

다른 대답을 진지하게 받아들입니다. 어떤 사회자가 여기 열 받게 될거야. – Lupocci

+1

당신이 자신의 것으로 오지 않고 Jontro의 대답을 받아 들여야했기 때문에 Downvoted. –

22

0x1a는 잘못된 xml 문자입니다. XML 1.0 문서에서이를 표현할 방법이 없습니다. [9] U + 0009, U + 000A, U + 000D : 다음 범위에 http://en.wikipedia.org/wiki/XML#Valid_characters에서

유니 코드 코드 포인트를 인용

는 XML 1.0 문서 유효이 유일한 C0가 을 제어하다 XML 1.0에서 허용; U + 0020-U + D7FF, U + E000-U + FFFD : BMP의 일부 문자 (모든 문자가 아닌) (일부는 제외) (U + FFFE 및 U + FFFF는 모두 을 금지). U + 10000-U + 10FFFF : 문자가 아닌 문자를 포함하여 보조 평면의 모든 코드 포인트가 포함됩니다.

+0

감사 답변. 나는 0x1a를 대쉬 문자 ('-')로 바꿨다. –

+0

당신이 할 수있는 upvote/정답을 받아 들일 수 – jontro