Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698

    [JAVA] chiarimenti parsing XML e DOM

    un file xml di esempio
    codice:
    <?xml version="1.0" encoding="iso-8859-1"?>
    
    <A1>
        <B1>Testo1</B1>
        <B2>
            Testo2
            <C nome="Nome"></C>
        </B2>
        Testo3
    </A1>
    
    <A2>Testo4</A2>
    Ho dei problemi nella navigazione del DOM, e volevo chiedere dei chiarimenti su come si raggiungono determinati nodi.
    Uso questo codice
    codice:
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document document = dBuilder.parse("c:\\prova.xml");
    NodeList e = document.getElementsByTagName("A");
    Node root = e.item(0);
    Ora, partendo dalla root A1, come mi sposto nell'albero?
    Ho notato che il firstChild di A1 è una stringa vuota (presumo il testo che Non c'è prima del tag B1). Allora come accedo a B1?
    Devo ripetere lo stesso procedimento usato per ottenere A1?

    Seguendo lo stesso ragionamento, è ragionevole supporre che se ho il Node B1 posso ottenere il testo con B1.getFirstChild()?

    Se mi rispondete a queste due domande presumo di poter ricavare la maniera per raggiungere ogni altro nodo di quell'albero, ma per il momento resto molto dubbioso

  2. #2
    ma chiamando getElementsByTagName("A") credo che ti restituisca la lista di nodi che fa match esattamente con la stringa "A", e non che contiene la stringa "A"...
    Quindi praticamente non ti vede nessun nodo, perchè nessun nodo ha nome "A"...
    almeno così mi ricordo...

  3. #3
    ti mando un esempio, da un progetto che feci a luglio...
    guarda la classe archiveSearch, che salva su una matrice di stringhe tutti i dati di ogni figlio di tutti i nodi "prodotto".
    codice:
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import src.Search.*;
    
    public class Principale
    {private JFrame frame;
     private JDesktopPane desktop;
     private JInternalFrame internalFrame;
     private JButton OKButton, CancelButton, ExitButton, Letto;
     private JTextField Termini, Anno;
     private JPanel pulsPanel, textPanel, warnPanel, warnLabelPanel;
     private Container desktopCont, buttonCont, textCont, warnCont, warnLabelCont;
     private Color colore = new Color(204, 204, 204);
     private String focusedField;
     private String[][] risRicerca;
     private Document doc;
    
     public Principale()
    	{final int WIDTH=400;
     	 final int HEIGHT=230;
    
    	 JFrame.setDefaultLookAndFeelDecorated(true);
    
    	 frame = new JFrame();
    	 frame.setTitle("Ricerca in archivio");
    	 frame.setSize(WIDTH, HEIGHT);
    	 frame.setResizable(false);
    	 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    	 pulsPanel = new JPanel();
    	 textPanel = new JPanel();
    
    	 addButtons();
    
    	 addTextFields();
    
    	 setContainer(buttonCont, frame, pulsPanel, "South");
    	 setContainer(textCont, frame, textPanel, "North");
    
    	 frame.show();
    
    	}
    
     private void addButtons()
    	{OKButton = new JButton("OK", new ImageIcon("images/ok.png"));
    	 CancelButton = new JButton("Cancella", new ImageIcon("images/cancel.png"));
    	 ExitButton = new JButton("Esci", new ImageIcon("images/exit.png"));
    
    	 OKButton.setToolTipText("Avvia la ricerca");
    	 CancelButton.setToolTipText("Reimposta i campi");
    	 ExitButton.setToolTipText("Esci dal programma");
    
    	 pulsPanel.add(OKButton);
    	 pulsPanel.add(CancelButton);
    	 pulsPanel.add(ExitButton);
    
    	 ActionListener mainListener = new mainWindowListener();
    	 OKButton.addActionListener(mainListener);
    	 CancelButton.addActionListener(mainListener);
    	 ExitButton.addActionListener(mainListener);
    	}
    
     private void addTextFields()
    	{Termini = new JTextField(20);
    	 Anno = new JTextField(4);
    
    	 JLabel TermLabel = new JLabel("Termine:");
    	 JLabel YearLabel = new JLabel("Anno:");
    
    	 Termini.setToolTipText("Inserisci i termini da cercare");
    	 Anno.setToolTipText("Inserisci l'anno");
    
    	 textPanel.add(TermLabel);
    	 textPanel.add(Termini);
    	 textPanel.add(YearLabel);
    	 textPanel.add(Anno);
    
    	 MouseListener mouseClickListen = new listenForMouse();
    	 Termini.addMouseListener(mouseClickListen);
    	 Anno.addMouseListener(mouseClickListen);
    
    	 KeyListener keyListen = new listenForKeys();
    	 OKButton.addKeyListener(keyListen);
    	 CancelButton.addKeyListener(keyListen);
    	 ExitButton.addKeyListener(keyListen);
    	}
    
     private void setContainer(Container cont, JFrame currFrame, JPanel panel, String area)
    	{cont = currFrame.getContentPane();
    	 cont.add(panel, area);
    	}
    
     private void mostraAvviso(String testoAvviso)
    	{desktopCont = frame.getContentPane();
    
    	 desktop = new JDesktopPane();
    	 desktop.setBackground(colore);
    
    	 desktopCont.add(desktop, BorderLayout.CENTER);
    
    	 internalFrame = new JInternalFrame("Avviso", false, false, false, false);
    	 internalFrame.setSize(350, 120);
    	 internalFrame.setLocation(20, 4);
    	 internalFrame.setBackground(Color.white);
    	 internalFrame.setFrameIcon(new ImageIcon("images/warning.png"));
    	 internalFrame.setVisible(true);
    
    	 desktop.add(internalFrame);
    
    	 Letto = new JButton("Letto");
    	 Letto.setToolTipText("Chiudi la finestra di avviso");
    
    	 JTextArea warnLabel = new JTextArea(testoAvviso);
    	 warnLabel.setEditable(false);
    	 warnLabel.setBackground(colore);
    
    	 warnPanel = new JPanel();
    	 warnPanel.add(Letto);
    
    	 warnLabelPanel = new JPanel();
    	 warnLabelPanel.add(warnLabel);
    
    	 ActionListener chiudiAvviso = new closeWarnListener();
    	 Letto.addActionListener(chiudiAvviso);
    
    	 warnCont = internalFrame.getContentPane();
    	 warnCont.add(warnPanel, "South");
    
    	 warnLabelCont = internalFrame.getContentPane();
    	 warnLabelCont.add(warnLabelPanel, "Center");
    
    	 internalFrame.moveToFront();
    
    	}
    
     private class closeWarnListener implements ActionListener
    	{public void actionPerformed(ActionEvent event)
    			{internalFrame.dispose();
    			}
    	}
    
     private class mainWindowListener implements ActionListener
    	{public void actionPerformed(ActionEvent event)
    			{Object source = event.getSource();
    
    			 if (source == OKButton)
    				{
    				 OKPressed();
    				}
    
    			 else if (source == CancelButton)
    				{
    				 CancelPressed();
    				}
    
    			 else if (source == ExitButton)
    				{
    				 System.exit(0);
    				}
    			}
    	}
    
     private class listenForMouse implements MouseListener
    	{public void mouseClicked(MouseEvent event)
    			{Object source = event.getSource();
    
    			 if(source == Termini)
    				{
    				 focusedField = "Termini";
    				}
    			 else if(source == Anno)
    				{
    				 focusedField = "Anno";
    				}
    			}
    
    	 public void mousePressed(MouseEvent event) {}
    	 public void mouseReleased(MouseEvent event) {}
    	 public void mouseEntered(MouseEvent event) {}
    	 public void mouseExited(MouseEvent event) {}
    	}
    
     private class listenForKeys implements KeyListener
    	{
    	 public void keyPressed(KeyEvent key)
    		{if(key.getKeyCode() == KeyEvent.VK_ENTER)
    			if(OKButton.isFocusOwner())
    				OKPressed();
    			else if(CancelButton.isFocusOwner())
    				CancelPressed();
    			else if(ExitButton.isFocusOwner())
    				System.exit(0);
    		}
    
    	 public void keyReleased(KeyEvent key) {}
    	 public void keyTyped(KeyEvent key) {}
    	}
    
     public String[][] archiveSearch(String termine, String anno)
    	{
    	 int i, j, y, currentIndex;
    
    	 String[][] extractData = new String[50][4];
    	 String[][] risult;
    
    	 	 try {
    	 	 	 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    	 	 	 DocumentBuilder db = dbf.newDocumentBuilder();
    	 	 	 try  {doc = db.parse("archivio.xml");
    				 Element root = doc.getDocumentElement();
    
    				 NodeList nl_prod = root.getElementsByTagName("prodotto");
    	 			 NodeList nl_child;
    				 Node currNode, elemNode;
    
    				 for (i=0; i<nl_prod.getLength(); i++)
    					{
    					 currNode = nl_prod.item(i);
    					 nl_child = currNode.getChildNodes();
    					 
    		 			 for (j=1, y=0; j<nl_child.getLength(); j+=2, y++)
    						{
    						 elemNode = nl_child.item(j);
    			 			 extractData[i][y] = elemNode.getFirstChild().getNodeValue();
    						}
    					}
    				}
    			 catch (IOException ioe)
    				{
    			 	 avvisaUtente("Errore: " + ioe); 
    				}
    		 	 catch (org.xml.sax.SAXException se) 
    				{Exception  x = se;
               			 if (se.getException() != null)
                   			x = se.getException();
               			 x.printStackTrace();
    				}
    		 	}
    		 catch (ParserConfigurationException parseExc) {parseExc.printStackTrace();}
    
    	 int numElem = 0;
    
    	 y=0;
    
    	 while (y<extractData.length && extractData[y][0] != null)
    		{
    		 numElem++;
    
    		 y++;
    		}
    
    	 currentIndex = -1;
    
    	 risult = new String[numElem][4];
    
    	 for(i=0; i<numElem; i++)
    		{
    		 if(!termine.equals("") && anno.equals(""))
    			{
    			 if(extractData[i][0].indexOf(termine) != -1 || extractData[i][2].indexOf(termine) != -1)
    				{
    			 	 currentIndex++;
    			 	 for(y=0; y<4; y++)
    			 	 	risult[currentIndex][y] = extractData[i][y];
    				}
    			}
    		 else if(termine.equals(""))
    			{
    			 if(extractData[i][1].indexOf(anno) != -1)
    				{
    			 	 currentIndex++;
    			 	 for(y=0; y<4; y++)
    			 	 	risult[currentIndex][y] = extractData[i][y];
    				}
    			}
    		 else
    			{
    			 if(extractData[i][1].indexOf(anno) != -1 || extractData[i][0].indexOf(termine) != -1 || extractData[i][2].indexOf(termine) != -1)
    				{
    			 	 currentIndex++;
    			 	 for(y=0; y<4; y++)
    			 	 	risult[currentIndex][y] = extractData[i][y];
    				}
    			}
    		}
    	 
    	 return risult;
    
    	}
    
    public void showResults(String[][] ris)
    	{
    	 new Ricerca(frame, ris);
    	}
    
    private void avvisaUtente(String messaggio)
    		{JOptionPane.showMessageDialog(frame, messaggio, "Errore", JOptionPane.ERROR_MESSAGE);
    		}
    
    private void OKPressed()
    	{
    	 if(Termini.getText().equals("") && Anno.getText().equals(""))
    		{
    		 String avv = "Prego, inserire almeno un parametro per la ricerca" + "\n" + "nel campo 'Termine' o nel campo 'Anno'";
    		 mostraAvviso(avv);
    		}
    	 else 
    		{if (!Anno.getText().equals("") && !Anno.getText().matches("[0-9]*"))
    			{
    		 	 String avv = "Attenzione, nel campo 'Anno'" + "\n" + "possono essere inseriti solo numeri";
    			 Anno.setText("");
    		 	 mostraAvviso(avv);
    			}
    
    	 	 else {
    		 	 risRicerca = archiveSearch(Termini.getText(), Anno.getText());
    
    		 	 if(risRicerca[0][0] == null)					
     				{
    	 	 	 	 String avv = "Nessun risultato corrisponde" + "\n" + "ai criteri di ricerca inseriti.";
    
     	 		 	 mostraAvviso(avv);
    				}
    			 else
    				showResults(risRicerca);
    			}
    		}
    				 
    	}
    
     private void CancelPressed()
    	{
    	 Termini.setText("");
    	 Anno.setText("");
    
    	 if(focusedField.equals("Termini"))
    	 	Termini.requestFocus();
    	 else if(focusedField.equals("Anno"))
    		Anno.requestFocus();
    	 else
    		Termini.requestFocus();
    	}
    
     public static void main(String[] args)
    	{
    	 Principale princ = new Principale();
    	}
    e questo è il file XML in cui cerca:

    codice:
    <?xml version="1.0" ?> 
    
     <archivio>
    
         <prodotto>
             <nome>prova01</nome> 
             <anno>2000</anno> 
             <descrizione>questa e' la prima prova</descrizione> 
             <prezzo>8</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova02</nome> 
             <anno>1998</anno> 
             <descrizione>questa e' la seconda prova</descrizione> 
             <prezzo>15</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova03</nome> 
             <anno>2001</anno> 
             <descrizione>questa e' la terza prova</descrizione> 
             <prezzo>21</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova04</nome> 
             <anno>2004</anno> 
             <descrizione>questa e' la quarta prova</descrizione> 
             <prezzo>82</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova05</nome> 
             <anno>2004</anno> 
             <descrizione>questa e' la quinta prova</descrizione> 
             <prezzo>32</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova06</nome> 
             <anno>1999</anno> 
             <descrizione>questa e' la sesta prova</descrizione> 
             <prezzo>65</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova07</nome> 
             <anno>2001</anno> 
             <descrizione>questa e' la settima prova</descrizione> 
             <prezzo>87</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova08</nome> 
             <anno>2003</anno> 
             <descrizione>questa e' l'ottava prova</descrizione> 
             <prezzo>232</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova09</nome> 
             <anno>2000</anno> 
             <descrizione>questa e' la nona prova</descrizione> 
             <prezzo>323</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova10</nome> 
             <anno>2002</anno> 
             <descrizione>questa e' la decima prova</descrizione> 
             <prezzo>94</prezzo> 
         </prodotto>
    
         <prodotto>
             <nome>prova11</nome> 
             <anno>2001</anno> 
             <descrizione>questa e' l'undicesima prova</descrizione> 
             <prezzo>2</prezzo> 
         </prodotto>
    
     </archivio>

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    ok non ho ancora letto il codice che è abb lungo ed è scomodo leggerlo nel forum
    lo scarico e me lo studio

    grazie

    ps. getElementsByTag("A") ritorna tutti i tag "A"

  5. #5
    prego
    cmq di tutto quel codice la classe che interessa a te e' archiveSearch.
    Le altre le ho messe per completezza. ci sarebbe anche un altro file, ma poi il codice veniva troppo lungo.
    buon "divertimento"

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.