2011-04-27 21 views
19

Entiendo la diferencia entre cómo funciona el analizador SAX frente al analizador XMLPull. De hecho, hay una explicación bastante buena aquí:analizador SAX vs XMLPull analizador

http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm El artículo está un poco centrado en .NET pero se aplican los conceptos.

Si bien estoy de acuerdo con la opinión del autor de que el analizador de extracción es más fácil de trabajar, estoy bastante confundido sobre qué tipo de analizador sería mejor en qué situaciones. Si alguien pudiera arrojar algo de luz y dirigirme a leer un poco más, lo agradecería.

Gracias.

Respuesta

16

Creo que ambos apestan. (Y tengo una mejor solución para sugerir)

Debe utilizar el Simple annotation based XML library. Me encanta y lo uso para todos mis proyectos. Si tiene read through the tutorial, entonces creo que encontrará que podrá hacer todo lo que quiera y mucho más rápido y con menos código. (Por lo tanto, es menos propenso a los errores) Internamente, la biblioteca utiliza los analizadores que usted solicitó para hacer el trabajo pesado.

Puede leer mi blog post on including it in an Android project si lo desea. (Funcionará en todas las versiones de Android desde al menos 1.5, lo que significa básicamente para todos)

+0

Gracias Robert! Lo leo y realmente me gusta. Guardaré mis comentarios en él después de jugar con él un poco más –

+0

@Robert WTF Robert :-) ¡Su sitio parece estar fuera de control! – dbm

+1

@dbm: lo siento mucho. Tuve que mover mi blog de un dominio a otro y todavía hay enlaces erróneos en el lugar y este fue uno de ellos. He editado esta publicación y he puesto el enlace al lugar donde se movió el blog. Gracias por alertarme y espero que la gente ahora disfrute de las nuevas publicaciones. (Estoy decepcionado porque se suponía que seguiría lanzando un redireccionamiento 301 al host anterior). –

1

Encuentro que es más fácil trabajar con el modelo SAX en una situación específica: donde va a construir su propia representación en memoria de todo el documento (o al menos partes importantes) con estructuras de datos personalizadas. (Si no es particular acerca de la estructura de datos, entonces el analizador DOM ya lo hace).

2

Ambos analizadores son básicamente la misma memoria/tiempo sabio. Lo único que tiene que ver con el analizador de extracción es que puede sacar los eventos como la estabilidad y el endeudamiento y solo prestar atención a los que desee.

donde al igual que con los analizadores de sax de android, no tienes otra opción, simplemente pones el código donde quieras pero tienes que incluir todos los eventos.

here es un enlace que puede consultar para obtener más información.

-1

recomendaría usar XmlPullParser uno ... el analizador de Sax no recuperó la etiqueta de un feed en mi prueba ... xmlpullparser lo hizo fácilmente =) también depende de sus preferencias también

9

Depende totalmente de la situación, por ejemplo, si el archivo xml es realmente grande que no puede optar por los analizadores DOM ya que primero traerán el archivo a memoria y luego será analizado y encontré que el análisis de un archivo de tamaño n requiere 7n de espacio de memoria. En este caso, debe optar por el analizador SAX, su luz y consumirá menos memoria.

El segundo caso es cuando el archivo no es realmente grande, en este caso puede ir a XML parser porque en esto tendrá control total sobre el XML. Puede omitir el ciclo de análisis donde eso no sea posible en SAX . Entonces, si la etiqueta que está buscando es la primera en el archivo, entonces, ¿por qué debería buscar todo el archivo?

Por lo que yo sé, si solo considera la velocidad con archivos pequeños, vaya con el analizador XML y si el archivo es grande y desea analizarlo todo, entonces vaya con SAX.

+2

el enlace está roto ... – thepoosh

+0

no está funcionando lo he comprobado ... –

+0

bueno, ayer estaba actuando, tal vez era una cosa del lado del servidor – thepoosh

2

Pull and Sax son similares en la forma en que ambos son enfoques de transmisión de bajo nivel que son más rápidos y más eficiente de la memoria que DOM, pero tirón tiene algunas ventajas sobre SAX:

Tire es más fácil de implementar que SAX porque no tiene que mantener el estado de su analizador sintáctico (utilizando variables adicionales para poder saber en qué lugar está actualmente su analizador en el árbol XML). Los bucles anidados en el código del analizador de extracción coincidirán más o menos con la jerarquía XML de su documento, por lo que creo que el código del analizador de extracción también es más legible que el código del analizador de SAX.

Con el código del analizador de extracción puede omitir bloques enteros que no desea analizar, por lo que también es más eficiente que SAX, que siempre extrae la información principal de todos los nodos. Usando un analizador de extracción, también puede detener el análisis sintáctico en cualquier momento si buscó la información que quería, lo que no es posible con SAX.

Además, puede implementar un analizador SAX utilizando un analizador de extracción. Lo opuesto no es posible.

Por todas estas razones, creo que el analizador de extracción es superior a SAX en todas las situaciones, sin embargo, como SAX, no es trivial implementarlo correctamente y hay que tener cuidado. Si no necesita los beneficios de baja velocidad de extracción y SAX y su XML está limpio, siempre puede usar una biblioteca de análisis de nivel superior como Simple para hacer el trabajo por usted.

0

Encontré una salida mejor y más eficiente al usar SAX en lugar de XMLPullParser ... Mi escenario es analizar los atributos bajo una etiqueta XML, podría hacerlo fácilmente e insertarlo en la base de datos sin problemas ... Creo que depende en situaciones, cuando necesito escribir en un archivo XML, prefiero DOM Parser ...

public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     currentElement = true; 
     db = new DatabaseHelper(thecontext); 
     if (qName.equals("Asa.Amms.Data.Entity.User")) { 
      int length = attributes.getLength(); 
      for (int i = 0; i < length; i++) { 
       String name = attributes.getQName(i); 
       if (name.equals("Id")) { 
        id = Integer.parseInt(attributes.getValue(i)); 
       } 
       if (name.equals("Login")) { 
        LoginID = attributes.getValue(i).toString(); 
       } 
       if (name.equals("Name")) { 
        Name = attributes.getValue(i).toString(); 
       } 
       if (name.equals("Password")) { 
        Password = attributes.getValue(i).toString(); 
       } 
       if (name.equals("ProgramOfficerId")) { 
        user_ProgramOfficerId = Integer.parseInt(attributes.getValue(i).toString()); 
       } 
      } 
      Log.i("Baal dhukbe", id + LoginID + Name + Password); 

      db.insertUser(id, LoginID, Name, Password, user_ProgramOfficerId); 
     } 
} 
Cuestiones relacionadas