¿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:
- Ajustes redimensionables en Android 3.1
- Android.view.InflateException: Línea de archivo XML binario # 12: Error al inflar la clase <unknown>
- Android XML: Centrando una vista en el diseño relativo- android: layout_centerHorizontal = "true" no funciona?
- Android: Ancho y altura del icono del iniciador en DP
- Vincular la vista personalizada de Android a una xml de diseño específico (¿es posible?)
<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
- ¿Cómo puedo volver a utilizar este botón de Android?
- ¿Cómo puedo concatenar cadenas estáticas con recursos de cadena XML?
- Botón uniformemente espaciado en Layout
- Mover mi barra de progreso con una imagen android
- Android utilizando diseños como una plantilla para crear múltiples instancias de diseño
- Cómo registrar la clase de aplicación en mi archivo de manifiesto
- Botones en una vista personalizada cuando la vista personalizada se encuentra en una pestaña
- ¿Cómo establecer la distancia entre textview y drawable en un botón?
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 utilizar la red para compartir archivos p2p en la plataforma Android?
- ¿Cómo establezco los valores predeterminados (Language & Keyboard) para un Android AVD (SDK 2.1 y 2.2)