E 'possibile ottenere il numero di riga corrente durante l'analisi di un documento XML con Xerces?

StackOverflow https://stackoverflow.com/questions/570216

  •  05-09-2019
  •  | 
  •  

Domanda

Ho un programma Java che analizza un documento XML utilizzando xerces API.

La mia classe l'analisi si estende org.apache.xerces.parsers.XMLDocumentParser, il sovraccarico delle startElement, endElement, metodi di caratteri.

Dal momento che è un documento complicato XML che è scritto a mano (principalmente un qualche tipo di elementi di configurazione), convalida classico di XSD o DTD non è sufficiente, e devo tornare per l'utente che il documento XML non è valido.

Ma 1 cosa che non potevo raggiungere è quello di aggiungere le informazioni nei messaggi di errore circa il numero di riga (e perché no numero della colonna troppo) che si currenlty essere analizzato e dove si verifica l'errore.

I cosa questo può essere possibile, perché eccezioni (org.apache.xerces.xni.parser.XMLParseException) generati dal parser quando il documento XML non è XML valido contengono queste informazioni.

È stato utile?

Soluzione

Non ho mai provato questo con Xerces, ma parser SAX può memorizzare un SAX Locator , da cui è possibile ottenere i numeri di riga e di colonna, come il documento viene analizzato (o dopo un'eccezione).

Sembra che XMLDocumentParser può essere in grado di fare la stessa cosa. La sua classe genitore, AbstractXMLDocumentParser, ha una startDocument metodo che è passato un parametro XMLLocator. Se si sovrascrive questo metodo, è possibile salvare il XMLLocator e utilizzare i suoi metodi getLineNumber e getColumnNumber.

Altri suggerimenti

Non sono sicuro che il modo "giusto" sarebbe ma guardando l'API, supponendo che fornisci XMLInputSource che prende un InputStream o un lettore si potrebbe fornire in un InputStream / lettore che è avvolto con un LineNumberInputStream o LineNumberReader e poi interrogare lo per il numero di riga.

es:

InputStream stream;

stream = ...;

new XMLInputSource(stream);

sarebbe diventato:

InputStream stream;
LineNumberInputStream lineStream;

stream = ...;
lineStream = new LineNumberInputStream(lineStream);

new XMLInputSource(lineStream);

// can now ask the line stream what line it is on via getLineNumber()

Sono indovinando si sarebbe anche bisogno di passare il LineNumberInputStream / LineNumberReader alla classe che si estende XMLDocumentParser.

Non so se tutto questo è fattibile nel codice.

In alternativa scavare nella fonte e scoprire come lo fanno. Se le variabili / metodi necessari per l'accesso sono privati, e non si sono preoccupati per il vostro codice di rottura, in futuro, si potrebbe utilizzare la riflessione e rimuovere le autorizzazioni di accesso per arrivare a questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top