2013-04-12 2 views
3

XMLStreamReader -> Местоположение имеет метод под названием getCharacterOffset().XMLStreamReader: получить смещение символов: XML из файла

К сожалению, Javadocs указывает, что это неоднозначно названный метод: он также может возвращать смещение байта (и это на практике кажется истинным); это, кажется, беспомощно возникает при чтении из файлов (например):

The Javadoc состояния:

Верните байты или символы смещения в источник входного сигнала это местоположения, указывающий на. Если источником входного сигнала является файл или байтовый поток , то это смещение байта в этот поток, но если входной источник является символом , то, то смещение является смещением символов. (выделено мной)

Мне очень нужен символ смещение; и я уверен, что мне дают байт смещение.

XML-код (кодированный UTF-8) содержится в (частично поврежденном 1G) файле. [Следовательно, необходимо использовать API нижнего уровня, который не жалуется на отсутствие правильной формы, пока у него действительно нет выбора, кроме как].

Вопрос

Что означает Javadoc, когда он говорит: «... источник входного сигнала является символом СМИ ...»: как я могу заставить его думать о моем входном файле как „характер“ СМИ - чтобы получить точный (характерный) смещение, а не смещение байта?

Extra-бла-бла:

[Я уверен, что это то, что происходит - когда я раздеть файл на части (с использованием некоторых известных тегов высокого уровня) я получаю несколько символов отсутствующих или дополнительных - неаккуратным способом - я откладываю разницу до нескольких многобайтовых символов, сбрасывающих счетчик: также когда я копирую (используя «head»/«tail», например, в Powershell - этот инструмент выглядит правильно признают [или предполагают UTF-8] и делают хорошее преобразование в UTF-16, насколько я вижу]

ответ

3

Смещение находится в единицах нижележащих Source.

XMLStreamReader знает, сколько единиц оно прочитало из Source, поэтому смещение рассчитывается в этих единицах.

A Stream работает в единицах byte, и поэтому вы получаете byte офсет.

A Reader Работы в единицах измерения char, и поэтому вы попадаете со смещением в char.

Документы для StreamSource более четко указаны в терминах «символьный носитель».

Может быть, попробовать что-то вроде

final Source source = new StreamSource(new InputStreamReader(new FileInputStream(new File("my.xml")), "UTF-8")); 
final XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(source); 
1

XMLInputFactory.createXMLStreamReader(java.io.InputStream) является поток байтов

XMLInputFactory.createXMLStreamReader(java.io.Reader) является поток символов

+0

При работе с потоком байт (XMLInputFactory.newInstance(). CreateXMLEventReader (новый FileInputStream (...))), является ли проблема, что возвращаемый тип getCharacterOffset() является int, но файл (в байтах) может быть файлом длинного размера в соответствии с File.length(), который возвращает long? –

Смежные вопросы