Разбор Java XML и оригинальные смещения байтов - PullRequest
9 голосов
/ 18 августа 2010

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 18 августа 2010

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 более высокого уровня.

edit: Found this example .

2 голосов
/ 30 октября 2014

Используйте 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();
    }
...