Est-il possible d'obtenir le numéro de ligne lors de l'analyse d'un document XML avec Xerces?

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

  •  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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top