Анализ Java XML и исходные смещения байтов

Я хотел бы проанализировать некоторый правильно сформированный XML в DOM, но я хотел бы знать смещение тега каждого узла в исходном носителе.

Например, если бы у меня был XML-документ с содержимым примерно так:

<html>
<body>
<div>text</div>
</body>
</html>

Я хотел бы знать, что узел начинается со смещения 13 в исходном медиа и (что более важно), что «текст» начинается со смещения 18.

Возможно ли это со стандартными парсерами Java XML? ДЖАКСБ? Если нет легкодоступного решения, какие изменения необходимы на пути синтаксического анализа, чтобы сделать это возможным?


person Bill Dwyer    schedule 17.08.2010    source источник
comment
Взгляните на этот вопрос stackoverflow.com/questions/43366566, чтобы найти смещения символов в больших XML-файлах и узнать, как их использовать с JAXB.   -  person jschnasse    schedule 16.05.2017
comment
См. также расположение JAXB в файле для несортированных объектов   -  person Vadzim    schedule 15.05.2019


Ответы (2)


SAX API предоставляет для этого довольно неясный механизм — org.xml.sax.Locator интерфейс. Когда вы используете SAX API, вы создаете подкласс DefaultHandler и передаете его методам синтаксического анализа SAX, а реализация синтаксического анализатора SAX должна вводить Locator в ваш DefaultHandler через setDocumentLocator(). По мере продолжения синтаксического анализа вызываются различные методы обратного вызова на вашем ContentHandler (например, startElement()), после чего вы можете обратиться к Locator, чтобы узнать позицию синтаксического анализа (через getColumnNumber() и getLineNumber()).

Технически это необязательная функциональность, но в javadoc говорится, что реализациям "настоятельно рекомендуется" предоставлять ее, поэтому вы, вероятно, можете предположить, что синтаксический анализатор SAX, встроенный в JavaSE, сделает это.

Конечно, это означает использование SAX API, что никому не интересно, но я не вижу способа получить доступ к этой информации с помощью API более высокого уровня.

редактировать: найдено в этом примере.

person skaffman    schedule 17.08.2010

Используйте XML Streamreader и его метод getLocation() для возврата объекта местоположения. location.getCharacterOffset() дает смещение в байтах текущего местоположения.

import javax.xml.stream.Location;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;

public class Runner {

public static void main(String argv[]) {

    XMLInputFactory factory = XMLInputFactory.newInstance();
    try{
    XMLStreamReader streamReader = factory.createXMLStreamReader(
           new FileReader("D:\\BigFile.xml"));

    while(streamReader.hasNext()){
        streamReader.next();
        if(streamReader.getEventType() == XMLStreamReader.START_ELEMENT){
            Location location = streamReader.getLocation();
            System.out.println("byte location: " + location.getCharacterOffset());
            }
        }
    } catch(Exception e){
        e.printStackTrace();
    }
person Lucasvw    schedule 30.10.2014