Хотите вызвать исключение, когда встречаете специальные символы UTF-8 в файле XML

1

Я разбираю XML файл с кодировкой UTF-8.

<?xml version="1.0" encoding="UTF-8"?>

Теперь наше деловое приложение имеет набор компонентов, которые разрабатываются разными командами и не используют одни и те же библиотеки для синтаксического анализа XML. Мой компонент использует JAXB, а другой компонент использует SAX и т.д. Теперь, когда в XML файле есть специальные символы, такие как "ä" или "ë" или "é" (символы с умлаутами), JAXB разбирает его правильно, но другие компоненты (суб-приложения) не могут правильно разобрать их и вызывать исключение.

Из-за необходимости ведения бизнеса я не могу изменить программирование для других компонентов, но я должен поместить ограничение/проверку в мое приложение, чтобы убедиться, что файл XML (data-load) не содержит таких символов.

Лучший способ убедиться, что файл не содержит вышеупомянутых (или похожих) символов, и я могу бросить исключение (или дать ошибку) прямо перед тем, как начать синтаксический анализ файла XML с помощью JAXB.

  • 0
    звучит так же просто, как и ваш вопрос - проверьте файл, если он содержит недопустимые символы ... если вы не можете полагаться на информацию заголовка, тогда вам нужно кодировать файл самостоятельно и посмотреть, не падает ли он ... вы можете прочитать файл используя определенную кодировку, см. stackoverflow.com/questions/3043710/…
  • 1
    Поведение, которое вы описываете, на самом деле невозможно, если только ваш XML не заявляет, что encoding="UTF-8" а на самом деле это не так, или другой компонент, который вы предоставляете, игнорирует объявление XML и пытается проанализировать его как унаследованную кодировку ( очень маловероятно). Я бы поспорил на первую ситуацию: вы создаете XML с неправильной кодировкой. Исправьте декларацию, чтобы она соответствовала кодировке вашего файла, или исправьте кодировку вашего файла как UTF-8. Чтобы понять, в чем дело , нам понадобится шестнадцатеричный фрагмент из затронутого файла.
Показать ещё 8 комментариев
Теги:
character-encoding
jaxb
utf-8

3 ответа

1

Вы должны иметь возможность обернуть XML-вход в java.io.Reader в котором вы указываете фактическое кодирование, а затем обрабатываете это нормально. Java будет использовать кодировку, указанную в XML для InputStream, но когда используется Reader будет использоваться кодировка Reader.

Unmarshaller unmarshaller = jc.createUnmarshaller();
InputStream inputStream = new FileInputStream("input.xml");
Reader reader = new InputStreamReader(inputStream, "UTF-16");
try {
    Address address = (Address) unmarshaller.unmarshal(reader);
} finally  {
    reader.close();
}
1

да, мой ответ был бы таким же, как упоминает laune...

static boolean readInput() {
    boolean isValid = true;
    StringBuffer buffer = new StringBuffer();
    try {
        FileInputStream fis = new FileInputStream("test.txt");
        InputStreamReader isr = new InputStreamReader(fis);
        Reader in = new BufferedReader(isr);
        int ch;
        while ((ch = in.read()) > -1) {
            buffer.append((char)ch);
            System.out.println("ch="+ch);
            //TODO - check range for each character 
            //according the wikipedia table http://en.wikipedia.org/wiki/UTF-8
            //if it a valid utf-8 character
            //if it not in range, the isValid=false;
            //and you can break here...
        }
        in.close();
        return isValid;
    } 
    catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

Я просто добавляю фрагмент кода...

  • 0
    Я бы использовал grep "[^\t\r\f -~]" $file && rm $file ;-)
1

Если ваш клиент отправляет вам XML файл с заголовком, где кодировка не соответствует содержимому файла, вы можете также отказаться от попытки сделать что-либо значимое в этом файле. - Действительно ли они отправляют данные, если заголовок не соответствует фактической кодировке? Это не XML, то. И вы должны их больше обвинить ;-)

Просто прочитайте файл как FileInputStream, байт за байтом. Если он содержит отрицательное значение байта, откажитесь его обрабатывать.

Вы можете сохранить настройки кодирования, такие как UTF-8 или ISO 8859-1, потому что все они имеют US-ASCII как правильное подмножество.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню