Ist es möglich, die aktuelle Zeilennummer beim Parsen eines XML-Dokuments mit Xerces zu bekommen?

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

  •  05-09-2019
  •  | 
  •  

Frage

Ich habe ein Java-Programm, das ein XML-Dokument mit xerces API analysiert.

Meine Parsing-Klasse erweitert org.apache.xerces.parsers.XMLDocumentParser, eine Überlastung der start, endelement, Zeichen Methoden.

Da es sich um eine komplizierte XML-Dokument ist, das mit der Hand geschrieben (in erster Linie eine Art Konfigurationselemente), klassische Validierung von XSD oder dtd ist nicht genug, und ich habe an den Benutzer zurückzugeben, die die XML-Dokument nicht gültig ist.

Aber 1, was ich nicht der Fall erreichen könnte die Informationen in den Fehlermeldungen über die Zeilennummer (und warum nicht Spaltennummer zu) hinzufügen, dass currenlty wird analysiert und wo der Fehler auftritt.

ich, was kann dies möglich sein, weil Ausnahmen (org.apache.xerces.xni.parser.XMLParseException) vom Parser erzeugt wird, wenn das XML-Dokument dieser Informationen nicht XML gültig enthalten ist.

War es hilfreich?

Lösung

Ich habe nie versucht, dies mit xerces, aber SAX-Parser kann eine SAX speichern startdocument Verfahren, welches übergeben wird ein XMLLocator Parameter. Wenn Sie diese Methode überschreiben, können Sie die XMLLocator speichern und seine getLineNumber und getColumnNumber Methoden an.

Andere Tipps

Nicht sicher, was die „richtige“ Art und Weise, aber auf der API-Suche wäre, vorausgesetzt, Sie XMLInputSource schaffen, die einen Inputstream oder ein Reader gelangen Sie in einem Inputstream / Reader bieten könnte, die mit einem Linenumberinputstream oder LineNumberReader gewickelt und dann abfragen für die Zeilennummer.

Beispiel:

InputStream stream;

stream = ...;

new XMLInputSource(stream);

würde:

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

Ich vermute, Sie würden auch die Linenumberinputstream / LineNumberReader Ihrer Klasse übergeben müssen, die XMLDocumentParser erstreckt.

Nicht sicher, ob das alles in Ihrem Code machbar ist.

Als Alternative in die Quelle graben und herauszufinden, wie sie es tun. Wenn die Variablen / Methoden, die Sie zugreifen müssen privat sind, und Sie sind nicht besorgt über Ihren Code in der Zukunft zu brechen, könnten Sie Reflektion verwenden und die Zugriffsberechtigungen entfernen, um es zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top