Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [Java, DOM+XML] Risultati discordanti.. Come risolvere?

    Ciao,
    non sono proprio un novellino di Java, ma ho un problema alquanto assurdo.

    Questo è il codice della mia funzione:
    codice:
    /**
    	 * 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

    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:
    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));
    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:
    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!

  2. #2

    son un idiota.

    Maledetta iterazione...

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

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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.