Est-il possible d'obtenir le numéro de ligne lors de l'analyse d'un document XML avec Xerces?
-
05-09-2019 - |
Question
J'ai un programme java qui analyse un document XML en utilisant l'API xerces.
Ma classe d'analyse syntaxique étend org.apache.xerces.parsers.XMLDocumentParser, la surcharge des méthodes startElement, endElement, caractères.
Comme il est un document XML complexe qui est écrit à la main (principalement certains genre d'éléments de configuration), validation classique par xsd ou dtd ne suffit pas, et je dois retourner à l'utilisateur que le document XML n'est pas valide.
Mais 1 chose que je ne pouvais pas atteindre est d'ajouter les informations contenues dans les messages d'erreur sur le numéro de ligne (et pourquoi pas le numéro de colonne trop) qui est actuellement en cours d'analyse et où l'erreur se produit.
Je chose que cela peut être possible, parce que les exceptions (org.apache.xerces.xni.parser.XMLParseException) générés par l'analyseur lorsque le document XML n'est pas XML valide contiennent ces informations.
La solution
Je ne l'ai jamais essayé avec Xerces, mais parseurs SAX peut stocker une SAX startDocument qui est passé un paramètre de XMLLocator
. Si vous remplacez cette méthode, vous pouvez enregistrer le XMLLocator
et utiliser ses méthodes de getLineNumber
et getColumnNumber
.
Autres conseils
Je ne sais pas ce que le « droit » chemin serait mais en regardant l'API, en supposant fournir XMLInputSource qui prend un InputStream ou un lecteur que vous pourriez fournir dans un InputStream / Reader qui est enveloppé d'un LineNumberInputStream ou LineNumberReader et ensuite de l'interroger pour le numéro de ligne.
par exemple:
InputStream stream; stream = ...; new XMLInputSource(stream);
deviendrait:
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()
Je devine que vous devrez également passer le LineNumberInputStream / LineNumberReader à votre classe qui étend XMLDocumentParser.
Je ne sais pas si tout cela est faisable dans votre code.
creuser dans la source alternative et savoir comment ils le font. Si les variables / méthodes dont vous avez besoin d'accès sont privés, et vous n'êtes pas inquiet au sujet de votre code de rupture dans l'avenir, vous pouvez utiliser la réflexion et de supprimer les droits d'accès pour nous mettre au travail.