Comment puis-je analyser un espace de noms à l'aide de l'analyseur SAX?

Utilisation d'une URL de recherche Twitter, c'est-à-dire. Http://search.twitter.com/search.rss?q=android renvoie un CSS qui a un élément qui ressemble à:

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

Assez simple. Mon code analyse tout (titre, lien, description, pubDate, etc.) sans aucun problème. Cependant, je suis nul sur:

  • Ionic ne peut pas exécuter la plate-forme ionique Android
  • Connexion Bluetooth entre Android et Linux (RPi) perdu lors de la première action d'écriture
  • GetOnClickListener () dans les vues Android
  • Comment agrandir / zoomer une partie de l'image
  • Comment configurer l'icône pour la boîte de dialogue dans Android
  • Fragments: supprimer tous les fragments dans une vue
  •  <google:image_link> 

    J'utilise Java pour analyser le flux RSS. Est-ce que je dois gérer les noms locaux composés différemment que je le nommerais plus simple?

    C'est le code qui analyse le lien, la description, le 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 ressemble à:

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

    StartElement ressemble à:

     @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

    5 Solutions collect form web for “Comment puis-je analyser un espace de noms à l'aide de l'analyseur SAX?”

    Un élément comme <google:image_link> a le nom local image_link appartenant à l'espace de noms google . Vous devez vous assurer que le cadre d'analyse XML est conscient des espaces de noms, et vous devriez alors trouver cet élément en utilisant l'espace de noms approprié.

    Par exemple, quelques interfaces SAX1 dans le package org.xml.sax ont été obsolètes, remplacées par des équivalents SAX2 qui incluent un support d'espace de noms (par exemple, SAX1 Parser est déconseillé et remplacé par SAX2 XMLReader ). Consultez la documentation sur la façon de spécifier l'espace de noms uri ou qualifié (préfixé) qName .

    Voir également

    • Espace de noms Wikipedia / XML
    • package org.xml.sax
    • Saxproject.org – Namespaces

    À partir de l'exemple, il n'est pas vraiment clair de quel espace de noms le préfixe «google» se lie à – la réponse précédente est légèrement incorrecte dans la mesure où elle n'est PAS dans l'espace de noms «google»; Plutôt, c'est un espace de noms qui préfigure le "google". En tant que tel, vous devez faire correspondre l'espace de noms (identifié par URI) et non le préfixe. SAX a une manière confuse de signaler les combinaisons de nom local / préfixe d'espace de noms, et cela dépend du fait que le traitement de l'espace de noms soit même activé.

    Vous pouvez également envisager d'autres bibliothèques / API de traitement XML; Tandis que les implémentations SAX sont performantes, il existe des alternatives aussi rapides et plus pratiques. Les implémentations Stax (javax.xml.stream. *) Comme Woodstox (et même par défaut que JDK 1.6 est livré) sont rapides et un peu plus pratiques. Et la bibliothèque StaxMate qui s'appuie sur Stax est beaucoup plus simple à utiliser pour la lecture et l'écriture, et plus rapidement que les implémentations SAX comme Xerces. L'API Plus Stax a moins de bagages pour la gestion de l'espace de noms, de sorte qu'il est plus facile de voir quel est l'espace de noms réel des éléments.

    Comme les polygenelubricants utilisateurs ont déclaré: généralement, l'analyseur doit être conscient de l'espace de noms pour gérer les éléments qui appartiennent à un espace de noms préfixé. (Comme cet élément <google:image_link> .)

    Cela doit être défini comme une "fonctionnalité d'analyseur" que AFAIK peut se faire de différentes façons: l'interface XMLReader possède elle-même la méthode setFeature() qui peut être utilisée pour définir des fonctionnalités pour un certain analyseur, mais vous pouvez également utiliser la même méthode pour SAXParserFactory Classe afin que cette usine génère des analyseurs avec ces fonctionnalités déjà activées ou désactivées. Les indicateurs de fonctionnalité standard SAX2 devraient être sur le site Web de SAXproject, mais au moins certains d'entre eux sont également répertoriés dans la documentation API Java du package org.xml.sax .

    Pour les documents simples, vous pouvez essayer de prendre un raccourci. Si vous ne vous occupez pas vraiment des espaces de noms et des noms d'éléments comme dans une combinaison URL + nom local, et vous pouvez faire en sorte que les éléments que vous recherchez (et seulement ceux-ci) ont toujours un certain préfixe et qu'il n'y a pas d'éléments de D'autres espaces de noms avec le même nom local, vous pouvez simplement résoudre votre problème en utilisant le paramètre startElement() méthode startElement() au lieu de localName ou vice versa ou en ajoutant / annulant le préfixe de la chaîne de noms de balises à laquelle vous comparez.

    Le contenu des paramètres namespaceUri , qname ou localName est selon les spécifications Java effectivement facultatives et AFAIK elles peuvent être null pour cette raison. Ceux-ci sont null dépend de ce que sont les «fonctionnalités d'analyseur» susmentionnées qui affectent les espaces de noms. Je ne sais pas si le paramètre qui est null varie entre les éléments dans un espace de noms et les éléments sans espace de noms – Je n'ai pas étudié ce comportement.

    PS. XML est sensible à la casse. Donc, idéalement, vous n'avez pas besoin d'ignorer les cas dans la comparaison de chaînes de noms de tags.
    -Première publication, yay!

    Peut-être aider quelqu'un à utiliser l' utilitaire Android SAX . J'essayais de géo: lat pour obtenir l'élément lat de l'espace de noms geo.

    Exemple de XML:

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

    La première tentative est revenue nulle:

     item.getChild("geo:lat"); 

    Comme suggéré ci-dessus, j'ai trouvé passer l'URI de l'espace de noms à la méthode getChild.

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

    À l'aide de la méthode startPrefixMapping de mon gestionnaire xml, j'ai pu analyser le texte d'un espace de noms.

    J'ai placé plusieurs appels sur cette méthode sous mon instanciage de gestionnaire.

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

    Où dc est l'espace de noms <dc:author>some text</dc:author>

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.