[Java - XML+DOM] Cosa non capisco di questa funzione??

di il
1 risposte

[Java - XML+DOM] Cosa non capisco di questa funzione??

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!

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte