Wie kann ich einen Namespace mit dem SAX-Parser analysieren?

Verwenden einer twitter search URL ie. Http://search.twitter.com/search.rss?q=android gibt CSS zurück, das ein Element hat, das aussieht:

<item> <title>@UberTwiter still waiting for @ubertwitter android app!!!</title> <link>http://twitter.com/meals69/statuses/21158076391</link> <description>still waiting for an app!!!</description> <pubDate>Sat, 14 Aug 2010 15:33:44 +0000</pubDate> <guid>http://twitter.com/meals69/statuses/21158076391</guid> <author>Some Twitter User</author> <media:content type="image/jpg" height="48" width="48" url="http://a1.twimg.com/profile_images/756343289/me2_normal.jpg"/> <google:image_link>http://a1.twimg.com/profile_images/756343289/me2_normal.jpg</google:image_link> <twitter:metadata> <twitter:result_type>recent</twitter:result_type> </twitter:metadata> </item> 

Ziemlich einfach. Mein Code analysiert alles (Titel, Link, Beschreibung, pubDate, etc.) ohne Probleme. Allerdings bekomme ich null auf:

 <google:image_link> 

Ich verwende Java, um den RSS-Feed zu analysieren. Muss ich zusammengesetzte Ortsnamen anders behandeln als ich einen einfacheren Ortsnamen hätte?

Dies ist das Bit des Codes, der ausgibt Link, Beschreibung, pubDate, etc:

 @Override public void endElement(String uri, String localName, String name) throws SAXException { super.endElement(uri, localName, name); if (this.currentMessage != null){ if (localName.equalsIgnoreCase(TITLE)){ currentMessage.setTitle(builder.toString()); } else if (localName.equalsIgnoreCase(LINK)){ currentMessage.setLink(builder.toString()); } else if (localName.equalsIgnoreCase(DESCRIPTION)){ currentMessage.setDescription(builder.toString()); } else if (localName.equalsIgnoreCase(PUB_DATE)){ currentMessage.setDate(builder.toString()); } else if (localName.equalsIgnoreCase(GUID)){ currentMessage.setGuid(builder.toString()); } else if (uri.equalsIgnoreCase(AVATAR)){ currentMessage.setAvatar(builder.toString()); } else if (localName.equalsIgnoreCase(ITEM)){ messages.add(currentMessage); } builder.setLength(0); } } 

StartDocument sieht aus wie:

 @Override public void startDocument() throws SAXException { super.startDocument(); messages = new ArrayList<Message>(); builder = new StringBuilder(); } 

StartElement sieht aus wie:

 @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { super.startElement(uri, localName, name, attributes); if (localName.equalsIgnoreCase(ITEM)){ this.currentMessage = new Message(); } } 

Tony

  • Wie karte ich eine Liste der Liste zu RecyclerView
  • Warum verschwinden die Elemente, wenn ich die listView scroll?
  • Das Attribut ist nicht deklariert (Android) auf grundlegenden XML-Attributen
  • TextView nicht blättern
  • Android, senden und empfangen XML über HTTP POST-Methode
  • AdView - Fehlende AdActivity mit Android: configChanges in AndroidManifest.xml
  • Verbindung PhoneGap mit localhost Webservice
  • Android: Ausrichtung von vier Quadraten
  • 5 Solutions collect form web for “Wie kann ich einen Namespace mit dem SAX-Parser analysieren?”

    Ein Element wie <google:image_link> hat den lokalen Namen image_link , der zum google Namespace gehört. Sie müssen sicherstellen, dass das XML-Parsing-Framework sich der Namespaces bewusst ist und Sie dann dieses Element mit dem entsprechenden Namespace finden müssen.

    Zum Beispiel wurden einige SAX1-Schnittstellen im package org.xml.sax veraltet, ersetzt durch SAX2-Pendants, die Namespace-Unterstützung enthalten (zB SAX1 Parser wird veraltet und durch SAX2 XMLReader ). Konsultieren Sie die Dokumentation, wie Sie den Namespace uri oder qualifizierte (vorangestellte) qName .

    Siehe auch

    • Wikipedia / XML-Namespace
    • package org.xml.sax
    • Saxproject.org – Namensräume

    Von der Probe ist es nicht klar, welchen Namespace das 'google' Präfix bindet – vorherige Antwort ist etwas falsch, dass es nicht in "google" Namespace ist; Eher, es ist ein Namespace, der Präfix "google" bindet an. Als solche müssen Sie den Namespace (identifiziert durch URI) und nicht Präfix entsprechen. SAX hat verwirrende Weise, lokale Namens- / Namensraum-Präfix-Kombinationen zu melden, und es hängt davon ab, ob die Namespace-Verarbeitung sogar aktiviert ist.

    Sie könnten auch alternative XML-Verarbeitungsbibliotheken / APIs betrachten; Während SAX-Implementierungen performant sind, gibt es so schnelle und bequemere Alternativen. Stax (javax.xml.stream. *) Implementierungen wie Woodstox (und sogar Standard eins, mit dem JDK 1.6 kommt) sind schnell und etwas bequemer. Und StaxMate- Bibliothek, die auf Stax baut, ist viel einfacher für das Lesen und Schreiben zu verwenden, und schnell so schnell wie SAX-Implementierungen wie Xerces. Plus Stax API hat weniger Gepäck für Namespace Handling so ist es einfacher zu sehen, was ist der eigentliche Namespace von Elementen.

    Wie Benutzer polygenelubricants sagte: Im Allgemeinen muss der Parser Namensraum bewusst sein, um Elemente zu behandeln, die zu einem vorangestellten Namespace gehören. (Wie das <google:image_link> Element.)

    Dies muss als "Parser-Funktion" gesetzt werden, die AFAIK auf wenige verschiedene Arten machen kann: Die XMLReader-Schnittstelle selbst hat die Methode setFeature() , mit der Funktionen für einen bestimmten Parser gesetzt werden können, aber auch für SAXParserFactory dieselbe Methode verwenden kann Klasse, so dass diese Fabrik generiert Parser mit diesen Funktionen bereits ein oder aus. SAX2-Standard-Feature-Flags sollten auf der Website von SAXproject sein, aber zumindest einige von ihnen sind auch in der Java-API-Dokumentation des Pakets org.xml.sax aufgelistet .

    Für einfache Dokumente können Sie versuchen, eine Verknüpfung zu nehmen. Wenn Sie sich nicht wirklich um Namespaces und Elementnamen wie in einer URL + local-name Kombination kümmern, und Sie können vertrauen, dass die Elemente, die Sie suchen (und nur diese) immer ein bestimmtes Präfix haben und dass es keine Elemente gibt Andere Namespaces mit dem gleichen lokalen Namen, dann könntest du dein Problem einfach lösen, indem du den qname Parameter von startElement() -Methode anstelle von localName oder umgekehrt oder durch Hinzufügen / localName des Präfixes aus der Markennamen-String, mit der du vergleichst,

    Der Inhalt der Parameter namespaceUri , qname oder localName ist nach Java specs eigentlich optional und AFAIK können sie aus diesem Grund null . Welche von ihnen sind null hängt davon ab, was sind die oben genannten "Parser Features", die Namespaces beeinflussen. Ich weiß nicht, dass der Parameter, der null , zwischen Elementen in einem Namespace und Elementen ohne Namensraum variieren kann – ich habe dieses Verhalten nicht untersucht.

    PS XML ist case sensitive. Also idealerweise brauchst du den Fall nicht im Tag-Namen-String-Vergleich zu ignorieren.
    – Erste Post, Jay!

    Kann jemand helfen, mit dem Android SAX verwenden . Ich habe versucht geo: lat, um das Lat-Element aus dem Geo-Namensraum zu bekommen.

    Beispiel-XML:

     <item> <title>My Item title</title> <geo:lat>40.720741</geo:lat> </item> 

    Erster Versuch versuchte null:

     item.getChild("geo:lat"); 

    Wie oben angedeutet, fand ich den Namespace URI an die getChild-Methode gearbeitet.

     item.getChild("http://www.w3.org/2003/01/geo/wgs84_pos#", "lat"); 

    Mit startPrefixMapping-Methode von meinem xml-Handler konnte ich den Text eines Namespaces analysieren.

    Ich habe mehrere Anrufe auf diese Methode unter meinem Handler Instantiierung.

     GoogleReader xmlhandler = new GoogleReader(); xmlhandler.startPrefixMapping("dc", "http://purl.org/dc/elements/1.1/"); 

    Wo dc ist der namespace <dc:author>some text</dc:author>

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.