2010-08-17 13 views
8

Me gustaría analizar un XML bien formado en un DOM, pero me gustaría saber el desplazamiento de la etiqueta de cada nodo en el medio original.Java XML Parsing y desvíos de bytes originales

Por ejemplo, si tuviera un documento XML con el contenido algo como:

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

me gustaría saber que el nodo se inicia en el desplazamiento 13 en el medio original, y (lo más importante) que "texto" comienza en el desplazamiento 18.

¿Esto es posible con los analizadores XML estándar de Java? JAXB? Si no hay una solución disponible, ¿qué tipo de cambios son necesarios a lo largo de la ruta de análisis para que esto sea posible?

+0

Eche un vistazo a esta pregunta http://stackoverflow.com/questions/43366566 para encontrar las compensaciones de caracteres en archivos XML grandes y cómo usarlos con JAXB. – jschnasse

Respuesta

4

La SAX API proporciona un mecanismo bastante oscuro para esto - la interfaz org.xml.sax.Locator. Cuando utiliza la API SAX, subclase DefaultHandler y la pasa a los métodos de análisis SAX, y se supone que la implementación del analizador SAX inyecte un Locator en su DefaultHandler a través de setDocumentLocator(). A medida que avanza de análisis, los diversos métodos de devolución de llamada en su ContentHandler se invocan (por ejemplo startElement()), en cuyo momento puede consultar el Locator para averiguar la posición de análisis (a través de getColumnNumber() y getLineNumber())

Técnicamente, se trata de una funcionalidad opcional, pero el javadoc dice que las implementaciones son "fuertemente alentadas" a proporcionarlo, por lo que es probable que asuma que el analizador SAX integrado en JavaSE lo hará.

Por supuesto, esto significa usar la API SAX, que no es la idea de diversión de nadie, pero no veo una forma de acceder a esta información usando una API de nivel superior.

corregir: Encontrado this example.

1

Utilice el XML Streamreader y su método getLocation() para devolver el objeto de ubicación. location.getCharacterOffset() proporciona el desplazamiento de bytes de la ubicación actual.

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