StreamException: недопустимый символ XML (Unicode: 0x1a) - PullRequest
2 голосов
/ 14 декабря 2011

Я использую XStream для сохранения объекта пользователя в файл.

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);
        }
    }
}

Когда я пытаюсь прочитать его по следующему коду, я получаю исключение: com.thoughtworks.xstream.io.StreamException:: недопустимый символ XML (Unicode: 0x1a) был найден в содержимом элемента документа.

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

Есть идеи?

Ответы [ 2 ]

25 голосов
/ 14 декабря 2011

0x1a - недопустимый символ xml.Невозможно представить его в документе xml 1.0.

Цитируется из http://en.wikipedia.org/wiki/XML#Valid_characters

Кодовые точки Unicode в следующих диапазонах действительны в документах XML 1.0: [9]U + 0009, U + 000A, U + 000D: это единственные элементы управления C0, принятые в XML 1.0;U + 0020 – U + D7FF, U + E000 – U + FFFD: это исключает некоторые (не все) не-символы в BMP (все суррогаты, U + FFFE и U + FFFF запрещены);U + 10000 – U + 10FFFF: сюда входят все кодовые точки в дополнительных плоскостях, включая не символы.

6 голосов
/ 15 декабря 2011

Я заменил 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...