Wie bekomme ich ein Attribut von einem XMLReader?

8

Ich habe HTML, das ich mit Spanned in ein Html.fromHtml(...) konvertiere, und ich habe ein benutzerdefiniertes Tag, das ich darin verwende:

%Vor%

Also habe ich ein TagHandler implementiert, um dieses benutzerdefinierte Tag zu behandeln, so:

%Vor%

In diesem Fall bekomme ich eine SAX-Ausnahme, da ich glaube, dass das "id" -Feld eigentlich ein Attribut und keine Eigenschaft ist. Es gibt jedoch keine Methode getAttribute() für XMLReader . Also meine Frage ist, wie bekomme ich den Wert des Feldes "ID" mit dieser XMLReader ? Danke.

    
Jason Robinson 05.08.2011, 06:22
quelle

5 Antworten

9

Hier ist mein Code, um die privaten Attribute von xmlReader durch Reflektion zu erhalten:

%Vor%

Hinweis: Sie könnten die Werte in eine Map einfügen, aber für meine Verwendung ist das zu viel Aufwand.

    
rekire 04.03.2013, 07:08
quelle
8

Basierend auf der Antwort von rekire habe ich diese etwas robustere Lösung entwickelt, die mit jedem Tag umgehen kann.

%Vor%

Und in handleTag tun:

%Vor%

Und dann sind die Attribute wie folgt zugänglich:

attributes.get ("Mein Attributname");

    
slott 02.07.2014 15:08
quelle
3

Es ist möglich, XmlReader von TagHandler zu verwenden und Zugriff auf Tag-Attributwerte ohne Reflektion zu erhalten, aber diese Methode ist noch einfacher als die Reflektion. Der Trick besteht darin, ContentHandler used von XmlReader durch ein benutzerdefiniertes Objekt zu ersetzen. Das Ersetzen von ContentHandler kann nur im Aufruf von handleTag() erfolgen. Das stellt ein Problem beim Abrufen von Attributwerten für das erste Tag dar, das durch Hinzufügen eines benutzerdefinierten Tags am Anfang von html behoben werden kann.

%Vor%

Mit dieser Klasse ist das Lesen von Attributen einfach:

%Vor%

Dieser Ansatz hat den Vorteil, dass er die Verarbeitung einiger Tags unter Verwendung der Standardverarbeitung für andere, z. Sie können sicherstellen, dass ImageSpan Objekte nicht erstellt werden:

%Vor%     
Juozas Kontvainis 10.04.2016 09:39
quelle
1

Es gibt eine Alternative zu den anderen Lösungen, die es nicht erlaubt, benutzerdefinierte Tags zu verwenden, sondern den gleichen Effekt:

%Vor%

Dann lies es so:

%Vor%

Je nachdem, was Sie mit Ihren benutzerdefinierten Tags tun möchten, können Ihnen die obigen Informationen helfen. Wenn Sie sie nur lesen möchten, brauchen Sie kein SpannableStringBuilder , sondern nur getText auf Spanned interface, um dies zu untersuchen.

Beachten Sie, dass Annotation , das <annotation foo="bar">...</annotation> repräsentiert, seit der API-Stufe 1 ein eingebautes Android ist! Es ist wieder einer dieser versteckten Edelsteine. Das Attribut hat die Einschränkung eines Attributs pro <annotation> -Tag, aber nichts hindert Sie daran, mehrere Anmerkungen zu verschachteln, um mehrere Attribute zu erhalten:

%Vor%

Wenn Sie die Schnittstelle Editable anstelle von Spannable verwenden, können Sie auch den Inhalt jeder Anmerkung ändern. Zum Beispiel den obigen Code ändern:

%Vor%

wird so aussehen, als ob Sie dies in der XML-Datei hatten:

%Vor%

Wenn Sie Änderungen vornehmen, die sich auf die Länge des Textes auswirken, müssen Sie darauf achten, dass sich die Abschnitte verschieben. Stellen Sie sicher, dass Sie die span start / end-Indizes zu den richtigen Zeiten lesen, am besten, wenn Sie sie in die Methodenaufrufe einbinden.

Mit

Editable können Sie auch eine einfache Suche durchführen und die Substitution ersetzen:

%Vor%     
TWiStErRob 29.07.2016 22:29
quelle
0

Wenn Sie nur ein Attribut benötigen, ist der Vorschlag von vorrtex eigentlich ziemlich solide. Um Ihnen ein Beispiel zu geben, wie einfach es zu handhaben wäre, schauen Sie hier nach:

%Vor%

Und in Ihrem benutzerdefinierten TagHandler verwenden Sie nicht gleich, sondern indexOf

%Vor%

Und Sie können dann den Postfix-Wert in Ihrem OnClick-View-Parameter als Tag übergeben, um ihn generisch zu halten.

    
slott 02.07.2014 11:35
quelle

Tags und Links