[SOLUCIONADO] [DUDA] datos iguales en Atributos XML con SAX

Iniciado por RyogiShiki, 11 Noviembre 2011, 22:11 PM

0 Miembros y 1 Visitante están viendo este tema.

RyogiShiki

Hola que tal.

Puese que el título no sea lo más descriptivo, pero no halle mejor forma para expresarme. Estaba trabajando con XML para tomar la información de estos y presentarla. Los XML los cojo de una página web. El caso es que no he logrado acceder  a los datos que se encuentran en elementos con atributos iguales. Solo puedo acceder al primer elemento. Les pongo un ejemplo:

Código (xml) [Seleccionar]

<ann>
<anime id="7985" gid="2941429925" type="TV" name="Genshiken 2" precision="TV">
<info gid="2626798855" type="Picture" src="/thumbnails/fit200x200/encyc/A7985-8.jpg"/>
<info gid="2657624020" type="Main title" lang="JA">Genshiken 2</info>
<info gid="2428493304" type="Alternative title" lang="EN">The Society for the Study of Modern Visual Culture 2</info>
<info gid="3635378568" type="Alternative title" lang="JA">げんしけん2</info>
<info gid="1637100485" type="Alternative title" lang="ZH-TW">現視研2</info>
<info gid="1944607895" type="Alternative title" lang="KO">현시연 2</info>
<info gid="365802192"  type="Genres">comedy</info>
<info gid="1000686579" type="Genres">romance</info>
<info gid="2461978479" type="Genres">slice of life</info>
</anime>
</ann>


Suponemos que tengo ese pedaso de XML como verán dentro del elemento info, encontramos varias veces el atributo "type" al cual se le asigna un valor, en este caso supongamos sea: "Genres", como se ve este se repite tres veces, para comedy, romance y slice of life. El problema es que al recolectar la información con SAX solamente he podido llegar hasta la primera que es comedy, pero aun no he logrado tomar el valor de las otras dos. Alguien sabe como puedo hacer esto? Los XML que estoy usando son muy engorrosos y tienen cantidades de atributos repetidos con diversos valores. No puedo usar como referencia el valor del atributo gid, porque siempre va a ser diferente.

Gracias a todos de antemano por la ayuda.


RyogiShiki

#1
Bueno no importa, ya lo he arreglado. En cierto sentido era muy simple. Poner un flag en el método starElement(...) que me indica que estoy dentro del elemento repetido. Luego en el método endElement(...) si el flag está en true entonces concateno el contenido de characters al atributo que mapea el elemento, justo después de eso pongo el flag en false, así la próxima vez que aparezca el elemento el flag se pone en true de nuevo y el elemento se procesa concatenando el contenido. Lo único es que al principio me deja un null extraño, pero nada que no se pueda arreglar facilmente. Dejo lo que hice por si alguien alguna vez le sirve

startElement:
Código (java) [Seleccionar]

   public void startElement(String namespaceURI,
String localName,
String qName,
Attributes attr) {
content.setLength(0);
System.out.println("startElement:" + qName); //Debug!

for (int i = 0; i < attr.getLength(); i++) {
if (attr.getLocalName(i).equals("name")) {
this.title = attr.getValue(i);
}
}

if (qName.equals("info")) {
for (int i = 0; i < attr.getLength(); i++) {
if (attr.getLocalName(i).equals("type")) {
if (attr.getValue(i).equals("Genres")) {
isSetGenere = true;
}
}
}
}
}


endElement:
Código (java) [Seleccionar]


public void endElement(String namespaceURI,
String localName,
String qName) throws SAXException {

if (isSetGenere) {
this.genere += content.toString() + " ";
}
isSetGenere = false;
}


Estoy seguro que para alguien que conoce bien SAX esto es muy simple, porque en realidad es casi que el procedimiento standar. Pero apenas hace poco empecé con SAX y el parseo de XML, llegando a la conclusión, de que es muy fácil si el documento es corto, pero si va tomando mucho contenido hacer el parser es tediosísimo y un completo dolor de cabeza. Por eso digo. ¡Que viva JSON! XD

Si algún MOD está por hay bien puede dar por terminado esto.

Saludos