Ciao,
non sono proprio un novellino di Java, ma ho un problema alquanto assurdo.
Questo è il codice della mia funzione:
mentre questa è la mia classe XMLDocumentTagInformationcodice:/** * 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(); }
codice: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:
all'inizio del for mi aggiunge soltanto 5 nodi: l'ultimo, ed a scalare i primi 4.. (Ultimo, 4°, 3°, 2°, 1°)codice:// Mi salvo: il nome del nodo, la posizione nel testo e la lunghezza del nodo. tag.addTag(tmpNode.getParentNode().getNodeName(), result.length(), getTextLength(tmpNode));
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:
codice: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!

Rispondi quotando