2010-08-17 16 views
8

Vorrei analizzare un XML ben formato in un DOM, ma mi piacerebbe conoscere l'offset del tag di ogni nodo nel supporto originale.Analisi XML Java e offset byte originali

Per esempio, se ho avuto un documento XML con l'qualcosa di contenuti come:

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

mi piacerebbe sapere che il nodo inizia all'offset 13 nel supporto originale, e (soprattutto) che "text" inizia con offset 18.

Ciò è possibile con i parser Java XML standard? JAXB? Se nessuna soluzione è facilmente disponibile, quale tipo di modifiche sono necessarie lungo il percorso di analisi per renderlo possibile?

+0

Dai un'occhiata a questa domanda http://stackoverflow.com/questions/43366566 per trovare gli offset di caratteri in file XML di grandi dimensioni e come utilizzare con JAXB. – jschnasse

risposta

4

L'API SAX fornisce un meccanismo piuttosto oscuro per questo: l'interfaccia org.xml.sax.Locator. Quando si utilizza l'API SAX, si sottoclasse lo DefaultHandler e lo si passa ai metodi di analisi SAX e l'implementazione del parser SAX deve iniettare un valore Locator nel numero tramite setDocumentLocator(). Con il procedere di analisi, i vari metodi di callback sul ContentHandler vengono invocati (ad es startElement()), a quel punto si può consultare il Locator per scoprire la posizione di analisi (tramite getColumnNumber() e getLineNumber())

Tecnicamente, questa è la funzionalità opzionale, ma la javadoc dice che le implementazioni sono "fortemente incoraggiate" a fornirle, quindi è probabile che si presuma che il parser SAX integrato in JavaSE lo farà.

Ovviamente, ciò significa utilizzare l'API SAX, che non è un'idea di divertimento, ma non riesco a vedere un modo per accedere a queste informazioni utilizzando un'API di livello superiore.

modifica: trovato this example.

1

Utilizzare XML Streamreader e il relativo metodo getLocation() per restituire l'oggetto posizione. location.getCharacterOffset() fornisce l'offset di byte della posizione corrente.

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