PDA

View Full Version : [Java - XML+DOM] Cosa non capisco di questa funzione??


jj.69kt
09-07-2010, 15:37
Ciao,
non sono proprio un novellino di Java, ma ho un problema alquanto assurdo.

Questo è il codice della mia funzione:
/**
* Contiene il testo piatto senza tag e senza spaziature errate.
*/
private static String result = "";

/**
* Contiene le informazioni sui tag. Nome, PosizioneApertura e PosizioneChiusura
*/
private static XMLDocumentTagInformation tag;

private static void getFullText(NodeList NL){

Node tmpNode = null;
NodeList tmpList = null;
tag = new XMLDocumentTagInformation();


// Scandisco la lista dei Nodi fornita in ingresso
for(int i=0;i<NL.getLength();i++){

tmpNode = NL.item(i);



if(tmpNode.hasChildNodes()){
// Se il nodo ha figli ne recupero la lista.
tmpList = tmpNode.getChildNodes();

// Stampa di DEBUG
System.out.print(tmpNode.getNodeName()+" -> Ha figli! (Posizione: "+result.length()+", lunghezza: "+getTextLength(tmpNode)+")\n------\n\n");

// Mi salvo: il nome del nodo, la posizione nel testo e la lunghezza del nodo.
tag.addTag(tmpNode.getParentNode().getNodeName(), result.length(), getTextLength(tmpNode));

//Richiamo *ricorsivamente* la funzione sul resto del "documento"
getFullText(tmpNode.getChildNodes());
}

// Se e' un nodo di testo ne ricavo il contenuto pulendolo da imperfezioni (spazi multipli, ritorni a capo ecc..)
if(tmpNode.getNodeType() == Node.TEXT_NODE){
String tmp = Utils.cleanStr(tmpNode.getTextContent());

// Mi salvo il contenuto solo se e' "sostanzioso"
if(tmp.trim().length() > 0)
result +=tmp;

// Stampa di DEBUG
//System.out.println("Ha testo:\n"+tmp+"\n");
}
}
}



private static int getTextLength(Node N) {

return Utils.cleanStr(N.getTextContent()).length();
}


mentre questa è la mia classe XMLDocumentTagInformation

package cs.ltw.server.util;

import java.util.HashMap;
import java.util.Vector;

public class XMLDocumentTagInformation {

private HashMap<Integer, String> tagNames;
private Vector<Integer> tagOpenPos;
private Vector<Integer> tagClosePos;

public XMLDocumentTagInformation(){
super();

this.tagNames = new HashMap<Integer, String>();
this.tagOpenPos = new Vector<Integer>();
this.tagClosePos = new Vector<Integer>();
}


public Integer addTag(String name, Integer open, Integer close){

tagNames.put(tagNames.size(), name);

tagOpenPos.add(open);
tagClosePos.add(close);

return tagNames.size()-1;
}

public String toString(){

if(tagNames.size() == 0)
return "{ null }";

String result = "{";
for(int i=0;i<tagNames.size();i++){
result += i +":";
result += tagNames.get(i) +"(";

result += tagOpenPos.get(i) +"-";
result += tagClosePos.get(i) +"), ";
}

result.substring(0, result.length()-2);
result += "}";

return result;
}

}



Chiamando la funzione getFullText su una lista di nodi ricavata con XPath, succede una cosa assai strana.
Su consolle mi stampa esattamente ciò che mi aspetto!
Ovvero: nome del nodo, posizione nel testo e lunghezza del nodo. Mentre quando è ora di aggiungere questi valori all'oggetto tag (un istanza di XMLDocumentTagInformation) non mi aggiunge assolutamente nulla...
Infatti se vado a stampare tag alla fine della computazione mi stampa "{ null }".

Cosa ancora piu strana se io sposto la riga:
// Mi salvo: il nome del nodo, la posizione nel testo e la lunghezza del nodo.
tag.addTag(tmpNode.getParentNode().getNodeName(), result.length(), getTextLength(tmpNode));

all'inizio del for mi aggiunge soltanto 5 nodi: l'ultimo, ed a scalare i primi 4.. (Ultimo, 4°, 3°, 2°, 1°)


IDEE??




PS: Se notate nella stampa a video uso tmpNode.getNodeName() mentre nel'aggiunta all'oggetto "tag" uso invece mpNode.getParentNode().getNodeName(). Questo perchè se tento di aggiungere con lo stesso comando con cui stampo mi aggiunge tutti i nodi con nome #text invece che col loro vero nome.

Esempio di output:
text -> Ha figli! (Posizione: 0, lunghezza: 8040)
------

body -> Ha figli! (Posizione: 0, lunghezza: 8040)
------

div1 -> Ha figli! (Posizione: 0, lunghezza: 8040)
------

head -> Ha figli! (Posizione: 0, lunghezza: 18)
------

head -> Ha figli! (Posizione: 18, lunghezza: 20)
------

p -> Ha figli! (Posizione: 38, lunghezza: 1293)
------

del -> Ha figli! (Posizione: 469, lunghezza: 4)
------

[Molti altri tag omessi per comodità._]

------

DOCUMENTO 1:
di VINCENZO CERAMILE VISIONI DEL CALVOUna mattina mi svegliai, mi guardai allo specchio e dissi: "Adesso basta, debbo subito fare qualcosa!" Mi lavai la testa col mio solito sciampo per bambini e giù di corsa a prendere l'autobus. [_TestoMolto lungo Tagliato per comodità._]
-------------

Contenuto di 'tag': { null }


Aiutatemi per piacere!

jj.69kt
09-07-2010, 19:51
Maledetta iterazione...

Ogni iterazione eseguivo questo comando:
tag = new XMLDocumentTagInformation();



Serve dire altro?
:muro: :muro: :muro: :muro: :muro: :muro: :muro: