Ich erstelle ein Werkzeug, das einige XML
Dateien analysiert (XHTML
Dateien, um genau zu sein). Der Zweck dieses Tools besteht nicht nur darin, die XML-Struktur zu validieren, sondern auch den Wert einiger Attribute zu überprüfen.Parsing XML-Datei mit der Erhaltung der Informationen über die Zeilennummer
Also habe ich meine eigene org.xml.sax.helpers.DefaultHandler
erstellt, um Ereignisse während des XML-Parsing zu behandeln. Eine meiner Anforderungen ist die Information über die aktuelle Zeilennummer. Also entschied ich mich, eine org.xml.sax.helpers.LocatorImpl
zu meiner eigenen DefaultHandler
hinzuzufügen. Dies löst fast alle meine Probleme, mit Ausnahme der XML-Attribute.
Lassen Sie uns ein Beispiel:
<rootNode>
<foo att1="val1"/>
<bar att2="val2"
answerToEverything="43"
att3="val3"/>
</rootNode>
Eine meiner Regeln gibt an, dass, wenn das Attribut answerToEverything
auf dem Knoten definiert ist bar
, von 42
seinen Wert nicht anders sein sollte.
Wenn ein solcher XML-Code gefunden wird, sollte mein Tool einen Fehler erkennen. Wie ich dem Benutzer eine genaue Fehlermeldung geben möchte, wie:
Fehler in der Datei "foo.xhtml", Zeile # 4: answerToEverything nur "42" als Wert zulassen.
mein Parser in der Lage ist die Zeilennummer bei der Analyse zu halten, auch für Attribute. Wenn wir die folgende Implementierung für meine eigene DefaultHandler
Klasse betrachten:
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("Start element <" + qName + ">" + x());
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println("Att '" + attributes.getQName(i) + "' = '" + attributes.getValue(i) + "' at " + locator.getLineNumber() + ":" + locator.getColumnNumber());
}
}
dann für den Knoten >bar>
, wird die folgende Ausgabe angezeigt:
Startelement, um 5:23
Att ‚att2‘ = 'val2' um 5:23
Att 'answerToEverything' = '43' um 5:23
Att 'ATT3' = 'val3' um 5:23
Wie Sie sehen können, ist die Zeilennummer falsch, da der Parser den gesamten Knoten einschließlich seiner Attribute als einen Block betrachtet.
Idealfall, wenn die Schnittstelle ContentHandler
würde die startAttribute
und startElementBeforeReadingAttributes
Methoden definiert haben, würde ich keine Probleme haben, hier: o)
Also meine Frage ist, wie kann ich mein Problem lösen?
Informationen, ich bin mit Java 6
ps: Vielleicht könnte ein weiterer Titel für diese Frage Java SAX wie die mit Attributen Parsen Ereignisse oder etwas Parsen sein ...
Das Verhalten, das Sie beobachten, ist angesichts der Beschreibung der Locator-Schnittstelle einigermaßen gültig. Die getLineNumber() -Methode gibt eine Approximation und nicht die absolute zurück. –
Also meine Frage ist, wie kann ich den absoluten Wert haben? – romaintaz
Ich glaube, du kannst nicht. Vor einiger Zeit habe ich etwas ähnliches versucht und nach ein paar Tagen aufgegeben - es scheint einfach nicht verfügbar zu sein, wenn man nicht die ganze Datei selbst lesen und analysieren will. –