¿Cómo puedo analizar un espacio de nombres con el analizador SAX?

Uso de una URL de búsqueda de twitter, es decir. Http://search.twitter.com/search.rss?q=android devuelve CSS que tiene un elemento que se parece a:

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

Bastante simple. Mi código analiza todo (título, enlace, descripción, pubDate, etc.) sin ningún problema. Sin embargo, estoy recibiendo null en:

 <google:image_link> 

Estoy utilizando Java para analizar el feed RSS. ¿Tengo que manejar los nombres locales compuestos de manera diferente que un nombre local más sencillo?

Este es el bit de código que analiza Link, Description, 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 se ve así:

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

StartElement se ve así:

 @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

Un elemento como <google:image_link> tiene el nombre local image_link perteneciente al espacio de nombres google . Debe asegurarse de que el marco de análisis XML es consciente de los espacios de nombres y, a continuación, tendría que encontrar este elemento utilizando el espacio de nombres adecuado.

Por ejemplo, algunas interfaces SAX1 en el package org.xml.sax han quedado obsoletas, reemplazadas por contrapartes SAX2 que incluyen soporte de espacio de nombres (por ejemplo, SAX1 Parser es obsoleto y sustituido por SAX2 XMLReader ). Consulte la documentación sobre cómo especificar el espacio de nombres uri o qName calificado (prefijado).

Ver también

  • Espacio de nombres Wikipedia / XML
  • package org.xml.sax
  • Saxproject.org – Espacios de nombres

De la muestra no está claro en realidad qué espacio de nombres que prefiere 'google' se une a – la respuesta anterior es ligeramente incorrecta en que no está en "google" espacio de nombres; Más bien, es un espacio de nombres al que se une el prefijo "google". Como tal usted tiene que emparejar el espacio de nombres (identificado por URI), y no el prefijo. SAX tiene una forma confusa de reportar combinaciones locales de nombre / prefijo de espacio de nombres, y depende de si el procesamiento del espacio de nombres está incluso habilitado.

También podría considerar bibliotecas alternativas de procesamiento XML / APIs; Mientras que las implementaciones SAX son eficaces, existen alternativas tan rápidas y convenientes. Las implementaciones de Stax (javax.xml.stream. *) Como Woodstox (e incluso la predeterminada que viene con JDK 1.6) son rápidas y un poco más convenientes. Y la biblioteca de StaxMate que se basa en la parte superior de Stax es mucho más fácil de usar tanto para leer y escribir, y speedwise tan rápido como implementaciones SAX como Xerces. Además, Stax API tiene menos espacio para el espacio de nombres de equipaje, por lo que es más fácil ver cuál es el espacio de nombres real de los elementos.

Al igual que el usuario polygenelubricants dijo: en general, el analizador necesita ser espacio de nombres para manejar elementos que pertenecen a algún espacio de nombres prefijado. (Al igual que <google:image_link> elemento.)

Esto tiene que ser definido como una "característica de analizador" que AFAIK se puede hacer de diferentes maneras: La interfaz XMLReader en sí tiene el método setFeature() que se puede utilizar para establecer las características de un analizador cierto, pero también puede utilizar el mismo método para SAXParserFactory Clase para que esta fábrica genere analizadores con esas características ya activadas o desactivadas. Los indicadores de características estándar de SAX2 deben estar en el sitio web de SAXproject, pero al menos algunos de ellos también aparecen en la documentación de la API de Java del paquete org.xml.sax .

Para documentos simples puede intentar tomar un atajo. Si en realidad no se preocupan por los nombres y nombres de los nombres como en una combinación URL + nombre local, y puede confiar en que los elementos que está buscando (y sólo éstos) siempre tienen cierto prefijo y que no hay elementos de Otros namespaces con el mismo nombre local entonces usted puede ser que apenas solucione su problema usando el parámetro del qname del startElement() del startElement() vez del localName o viceversa o añadiendo / dejando caer el prefijo de la secuencia del nombre de la etiqueta que usted compara a.

El contenido de los parámetros namespaceUri , qname o localName está de acuerdo con las especificaciones de Java realmente opcionales y AFAIK pueden ser null por este motivo. Las que son null dependen de cuáles son las "características del analizador" antes mencionadas que afectan a los espacios de nombres. No sé si el parámetro que es null varía entre los elementos de un espacio de nombres y los elementos sin un espacio de nombres – no he investigado ese comportamiento.

PD. XML es sensible a mayúsculas. Así que idealmente no es necesario ignorar el caso en la comparación de cadenas de nombre de etiqueta.
-¡Primer puesto, yay!

Podría ayudar a alguien usando el SAX de Android util . Estaba intentando geo: lat para obtener el elemento lat form el geo namepace.

XML de ejemplo:

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

Primer intento devuelto nulo:

 item.getChild("geo:lat"); 

Como se sugirió anteriormente, encontré pasar el URI de espacio de nombres al método getChild.

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

Utilizando el método startPrefixMapping de mi manejador xml, pude analizar el texto de un espacio de nombres.

Puse varias llamadas a este método debajo de mi instanciación del encargado.

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

Donde dc es el espacio de nombres <dc:author>some text</dc:author>

  • Cómo hacer la disposición con las esquinas redondeadas ..?
  • Cómo establecer la línea como un fondo utilizando xml (forma) a continuación para EditText?
  • Android: Lectura de XML desde un recurso local (para pruebas)
  • El diseño de Xml cambia al cambiar la orientación
  • Android define la forma XML como dibujable mediante programación
  • ¿Cómo usar la vista propia en el diseño?
  • Dibujo de múltiples formas con ShapeDrawable en xml con Android
  • ¿Es posible tener más de un archivo de recursos de cadena en Android?
  • Cómo subrayar el texto del botón en Android?
  • Listview cambia la posición de otras vistas en el teclado abierto
  • Android analiza un xml con saxparser
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.