Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327

    Problema nella lettura di un file xml con XPath

    Salve,
    sto leggendo un file xml con Xpath e sto riscontrato qualche problema nella lettura dei nodi che non riesco a spiegare. Veniamo a voi

    il file esempio che sto leggendo per fare dei test è il seguente

    codice:
    <series name="futurama">
        <season id="1">
    	<episode>Pilota spaziale 3000</episode>
    	<episode>La serie è atterrata</episode>
            <episode>Io, coinquilino</episode>
            <episode>L'amore perduto nello spazio</episode>
            <episode>Paura del pianeta robot</episode>
            <episode>Per un pesce di dollari</episode>
            <episode>I miei tre soli</episode>
            <episode>Palla di immondizia</episode>
            <episode>Un viaggio infernale</episode>
            <episode>Un volo da ricordare</episode>
            <episode>Università marziana</episode>
            <episode>Attacco alieno</episode>
            <episode>Gusto a sorpresa</episode>
        </season>
          <season id="2">
            <episode>Amazzoni in amore</episode>
            <episode>Un parassita perduto</episode>
            <episode>Aiuto, è Natale!</episode>
            <episode>Il quadrifoglio</episode>
            <episode>Pingui-bot di Gel-catraz</episode>
            <episode>Il pizzetto ballerino</episode>
            <episode>Cervello grosso, scarpa fine</episode>
        </season> 
    </series>
    per la lettura dei file xml sto utilizzando questi metodi

    codice:
        private Document createXMLDocument(String fileName) throws Exception {
            DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setNamespaceAware(true);
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document doc = builder.parse(fileName);
     
            return doc;
        }
     
        private NodeList readXMLNodes(Document doc, String xpathExpression) throws Exception {
            XPath xpath = XPathFactory.newInstance().newXPath();
            XPathExpression expr = xpath.compile(xpathExpression);
     
            Object result = expr.evaluate(doc, XPathConstants.NODESET);
            NodeList nodes = (NodeList) result;
     
            return nodes;
        }
     
        public static void main(String[] args) {
        	xml m = new xml();
            Document doc;
            NodeList nodes = null;
    		try {
    
    			doc = m.createXMLDocument("src/file.xml");
    
    			nodes = m.readXMLNodes(doc, "//series/season[@id='1']");
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			System.out.println("nodo non esistente");
    		}
    
    		System.out.println(nodes.item(0).getChildNodes().item(0).getTextContent());
    		//System.out.println(nodes.item(0).getChildNodes().getLength());
    
    }
    come si può vedere dalla path mi sto spostando su series e sulla season 1.
    Guardando l'xml i nodi presenti nella season 1 sono 13 ma se faccio un prinln di nodes.item(0).getChildNodes().getLength() ne trova 27.
    Se invece voglio stamparmi il contenuto di un nodo presente su season 1 faccio nodes.item(0).getChildNodes().item(0).getTextConte nt() però non stampa nulla, se faccio nodes.item(0).getChildNodes().item(1).getTextConte nt() stampa il contenuto del primo nodo cioè Pilota spaziale 3000... noto che non vi è alcuna progressione, se provo a stampare l'item(2) non stampa nulla, con item(3) ottengo il secondo nodo e cosi via... c'è questa alternanza... qualcuno riesce a spiegarmi dove sbaglio??

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    ciclando i 27 nodi e verificando di che nodo si tratta con getNodeType, noto che i nodi si alternano tra 1 e 3, quindi TextNode e ElementNode. Per quale motivo per ogni nodo mi vede un TextNode?? non potrei vedere direttamente tutti gli ElementNode??

  3. #3

    Re: Problema nella lettura di un file xml con XPath

    Originariamente inviato da hackerdm
    ...
    codice:
    ....
        public static void main(String[] args) {
        	xml m = new xml();
            Document doc;
            NodeList nodes = null;
    		try {
    
    			doc = m.createXMLDocument("src/file.xml");
    
    			nodes = m.readXMLNodes(doc, "//series/season[@id='1']");
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			System.out.println("nodo non esistente");
    		}
    
    		System.out.println(nodes.item(0).getChildNodes().item(0).getTextContent());
    		//System.out.println(nodes.item(0).getChildNodes().getLength());
    
    }
    qualcuno riesce a spiegarmi dove sbaglio??
    Sbagli l'expression.
    E' "/series/season[@id='1']" oppure "//season[@id='1']"
    lolide
    Java Programmer

    Informati

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    ma il getLenght mi restituisce cmq 27 nodi. Io vorrei vedere soltanto i nodi episode e non i TextNode

  5. #5
    Originariamente inviato da hackerdm
    ma il getLenght mi restituisce cmq 27 nodi. Io vorrei vedere soltanto i nodi episode e non i TextNode
    Utilizzando "/series/season[@id='1']" recuperi un tag season. Quindi poi facendo tag.getElementsByTagName("episode") recuperi la lista dei tag episode, oppure potresti fare direttamente "/series/season[@id='1']/episode" usando, in evaluate, XPathConstants.NODESET e facendo il cast a NodeList. Non dovresti avere problemi di node type. Se li hai ancora, cicli tutti i nodi, e per ogni Element confronti Element.getNodeType() con Element.ELEMENT_NODE per scovare solo gli Element Node
    lolide
    Java Programmer

    Informati

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    perfetto!! grazie mille!!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.