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!