2010-12-03 3 views
3

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

+0

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

+0

Also meine Frage ist, wie kann ich den absoluten Wert haben? – romaintaz

+0

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

Antwort

0

I Denken Sie daran, dass dies nur durch einen eigenen InputStream (oder Reader) möglich ist, der Zeilen zählt und irgendwie mit Ihrem SAX-Handler kommuniziert. Ich habe nicht versucht, dies selbst zu implementieren, aber ich glaube, dass es möglich ist. Ich wünsche Ihnen viel Glück und würde mich freuen, wenn es Ihnen gelingt, dies zu tun und Ihre Ergebnisse hier zu posten.

0

Suchen Sie nach einem Open-Source-XML-Editor, dessen Parser diese Informationen möglicherweise enthält.

Editoren verwenden nicht die gleiche Art von Parser, die eine Anwendung verwenden würde, die nur XML für Daten verwendet. Redakteure benötigen mehr Informationen, wie Sie Zeilennummern sagen, und ich würde auch Informationen über Leerzeichen denken. Ein Parser für einen Editor sollte keine Informationen über Zeichen in der Datei verlieren. So können Sie beispielsweise eine Formatfunktion oder "einschließendes Element auswählen" (Alt-Shift-Up in Eclipse) implementieren.

0

In beiden XmlBeans und JAXB ist es möglich, Zeilennummer Informationen zu erhalten. Sie könnten in Betracht ziehen, eines dieser Tools zu verwenden (es ist einfacher in XmlBeans).

Verwandte Themen