Newsgroup: it.comp.java
Titolo: Lettura file XML e valore root null

Ciao,
devo leggere un file XML usando JDOM. Il problema è che ottengo un
reference null al nodo di Root; mi chiedevo se ciò fosse dovuto al
fatto che non esiste la definzione dello schema (
http://www.myserver/
ReportRequest.xsd) o se fosse per altri motivi.
C'è qualche workaround per poter navigare un file XML senza avere/
raggiungere il file XSD ?
//START CODE
<?xml version="1.0"?>
<ReportRequest xmlns="
http://www.myserver/ReportRequest.xsd
">
  <ReportTemplate>
    <ReportAction>Replace</ReportAction>
    <Name>TimeSeries</Name>
   ...
  </ReportTemplate>
</ReportRequest>
***
...
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc=docBuilder.parse(filePath);
Node root=doc.getDocumentElement();
...
//END CODE
Grazie a tutti,
Ale

Io ho una mia implementazione x scorrere le coppie TAG-VALORE dei
files Xml,
riusciresti a leggere anche gli attributi, tranne (nel tuo caso)
quello chiamato "xmlns" presente nel nodo radice <ReportRequest>
Se ti può essere utile ti posto il codice

 Se ti può essere utile ti posto il codice
Si grazie tante, così faccio un confronto (puoi mettere il codice sul
newsgroup o inviarlo via email ad 
ale....@tiscali.it
)!
Il mio problema è che usando JDOM - da quanto mi sembra di capire - se
non esiste il file XSD, non riesce a mappare la root che rimane vuota
e quindi tutto il resto.
Ale

Allora, ti/vi posto il codice
è ancora in fase di lavorazione quindi pecca di commenti
ecco l'output che otterrai:
TAG: REPORTACTION --> VAL = replace.. isTag = true
TAG: NAME --> VAL = timeseries.. isTag = true
..... (0) .......................
Il numero 0 finale indica l'indice del nodo che è stato letto;
Per utilizzare questa classe scrivi/crea una classe Main così
composta:
public class Main {
    public static void main (String[] args)
    {
        new XmlEngine(
        /* utili.MyFileUtils.controllaCheQuestoFileSiaPresente(gc(),
_DIRdbGEO, nome_file_xml) */
        new java.io.File (
                 "ReportRequest.xml"
                 )
        )
        .traversingXmlNodes("ReportTemplate", true);  // ..., true)
==> .showMatrice()
    }
}
// ECCO IL CODICE
//package prog.xml;
/**
 * Created by IntelliJ IDEA.
 * User: Girdano "Mejoro" Fidilio
 * Date: 1-dic-2008
 * Time: 20.55.47
 * .... To change this template use File | Settings | File Templates.
 */
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;
public class XmlEngine { // extends utili.MyUtils {
    // CAMPI
    Document doc;
    // COSTRUTTORE
    public XmlEngine(java.io.File $name_file) {
    // TODO: integra la funzionalità
<<utili.MyFileUtils.controllaCheQuestoFileSiaPresente>>
    // CON IL METODO primaRiga() POSSIAMO EVITARE DI INDICARE
MANUALEMNTE
    // IL, oppure i, $name_root CHE VOGLIAMO LEGGERE DA QUESTO FILE
    ///*String primaRiga = */ out( primaRiga
($name_file) ); // .substringBetween("<!--", "-->")
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance
(); // get the factory
    try {
            DocumentBuilder db = dbf.newDocumentBuilder(); // Using
factory get an instance of document builder
            doc = db.parse($name_file); // parse using builder to get
DOM representation of the XML file
            // Validate and parse an XML from a String source
            // parse(new InputSource(new StringReader
(xmlString)));  // 
http://snippets.dzone.com/posts/show/315
            doc.getDocumentElement().normalize();
        }
        catch(javax.xml.parsers.ParserConfigurationException pce)
        {
            pce.printStackTrace();
        }
        catch(org.xml.sax.SAXException se)
        {
            se.printStackTrace();
        }
        catch(java.io.IOException ioe)
        {
            ioe.printStackTrace();
        }
    }
    // METODI
    /* private String primaRiga(java.io.File $nomeFile) {
    String riga = null;
    try {
    java.io.BufferedReader buff =
    new java.io.BufferedReader( new java.io.FileReader($nomeFile) );
    //FileWriter fine = new FileWriter("salva.txt");
    //BufferedWriter buffOut = new BufferedWriter(fine);
    boolean Eof = false;
    while(!Eof) {
        riga = buff.readLine();
        if(riga != null) {
            Eof = true;
        }
        //else { buffOut.write(riga);buffOut.newLine(); }
        // Chiusura
        buff.close();
        //buffOut.close();
        }
    }
    catch (Exception E) { System.err.println("spyFirstRow() :: Errore
Unknow"); }
    return riga;
    } */
   /*
    * I take a xml element and the tag name, look for the tag and get
    * the text content
    * i.e for <employee><name>John</name></employee> xml snippet if
    * the Element points to employee node and tagName is name I will
return John
    * @param $ele
    * @param $tagName
    * @return textVal
    */
    private String getTextValue(Element $ele, String $tagName) {
    String textVal = null;
    NodeList nl = $ele.getElementsByTagName($tagName);
        if(nl != null && nl.getLength() > 0)
        {
            Element el = (Element)nl.item(0);
            try
            {
            textVal = el.getFirstChild().getNodeValue();
                //System.out.println(" --> " + textVal);
            if (textVal == null)
                textVal = ""; // NON TORNIAMO MAI null X EVITARE
NullPointException
            }
            catch (NullPointerException npe) { // TROVATA UNA COPPIA
"vuota" DI TAG
            textVal = "";                      // ad esempio: <geo></
geo>
            }
        }
    return textVal;
    }
    public Matrice traversingXmlNodes(String $name_root, boolean
$show) {
    // $name_root INDICA IL NOME DEL TAG RADICE CONTENENTE L'ALBERO
DEI NODI
    NodeList nodeLst = doc.getElementsByTagName($name_root);
    int quanti_nodi = nodeLst.getLength();
    Matrice matrice = new Matrice(doc.getDocumentURI());
        // PER OGNI ELEMENTO, CONTROLLIAMO CHE SI TRATTI DI UN NODO,
        // E IN TAL CASO AGGIUNGIAMO IL SUO CONTENUTO ALLA MATRICE
        for (int n = 0; n < quanti_nodi; n++)
        {
            Node fstNode = nodeLst.item(n);
	        // OMESSO if (fstNode.getNodeType() == Node.ELEMENT_NODE)
            matrice.add(  n, listNodes( fstNode, new
ArrayList<CoppiaTagValore>() )  );
        }
    matrice = matrice.checkMatrice();
    if ($show) matrice.showMatrice();
    return matrice;
    }
    public Matrice traversingXmlNodes(String $name_root) {
    return traversingXmlNodes($name_root, false);
    }
    private ArrayList<CoppiaTagValore> listNodes(Node node,
ArrayList<CoppiaTagValore> $arr)
    {
    // DENTRO ret SALVERO' L'INSIEME DEI DIVERSI TAG & ATTRIBUTI
    // PRESENTI IN OGNI NODO, chiamato $name_root, DEL FILE .xml
    //ArrayList<CoppiaTagValore> ret = $arr;
    String nodeName = node.getNodeName();
    Node parentNode = node.getParentNode();
    //if (node instanceof Element) // QUESTO CONTROLLO NON E'
SUPERFLUO ??
    //{                            // VEDI:  if (fstNode.getNodeType()
== Node.ELEMENT_NODE)
        Element actual = (Element) node;
        String tagName = actual.getTagName();
        // SE E SOLO SE LA COPPIA DI TAG CONTIENE UN'INFORMAZIONE
VALIDA,
        // ovvero se non siamo in presenza di una coppia "vuota"
<tag></tag>,
        // ALLORA AGGIUNGIAMO IL NOME DEL TAG ED IL SUO VALORE
        String info = getTextValue((Element) parentNode, tagName);
        //System.out.println(" --> " + tagName + " - " + info + "__" +
info.length());
        if ( leLettereDiQuestaStringaNonSonoTutteDegliSpaziBianchi
(info) )
        $arr.add(
                new CoppiaTagValore(
                tagName,
                info, // getTextValue((Element) parentNode, tagName),
                true //  true INDICA CHE E' UN TAG
                )
        );
        NamedNodeMap attrs = node.getAttributes();
        // SE E SOLO SE L'ATTRIBUTO DEL TAG CONTIENE UN'INFORMAZIONE
VALIDA,
        // ovvero se non siamo in presenza di un valore
"vuoto" ..attributo=""
        // ALLORA AGGIUNGIAMO IL NOME DELL'ATTRIBUTO ED IL SUO VALORE
        for (int a = 0; a < attrs.getLength(); a++)
        {
        Attr attribute = (Attr) attrs.item(a);
        String attributo = attribute.getValue();
        if ( leLettereDiQuestaStringaNonSonoTutteDegliSpaziBianchi
(attributo) )
        $arr.add(
                new CoppiaTagValore(
                nodeName + "_" + attribute.getName(),
                attributo, // attribute.getValue(),
                false     //  flase INDICA CHE E' UN ATTRIBUTO
                )
        );
        }
    //} // CHIUDE L' if (node instanceof Element)
    NodeList list = node.getChildNodes();
    // PROCEDIAMO RICORSIVAMENTE PER OGNI ALTRO NODO
    if (list.getLength() > 0)
    {
        for (int i = 0; i < list.getLength(); i++)
        {
            Node child = list.item(i);
            if (child instanceof Element)
            {
                listNodes(list.item(i), /*ret*/$arr);
            }
        }
    }
    return /*ret*/$arr;
    }
    private boolean
leLettereDiQuestaStringaNonSonoTutteDegliSpaziBianchi(String $s) {
    String aux = $s.replaceAll("\\r+", "").replaceAll("\\n+", "")
                   .replaceAll("\\t+", "").replaceAll("\\s+", "");
    //boolean ret = true; if (aux.equals("")) ret = false; else ret =
true;
    //ret = (aux.equals("")) ? false : true;
    /*
    if (aux.equals("")) {ret = false;System.out.println("SI");}
    else
    {
        for (int c = 0; c < aux.length(); c++)
        if (aux.charAt(c) == ' ') ret = false;//continue;
        else {
            ret = true;
            break;
        }
    }
    */
    return !aux.equals(""); //ret; //aux.isEmpty() ? true : false;
    }
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\
\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//package prog.xml;
/**
 * Created by IntelliJ IDEA.
 * User: Giordano "Mejoro" Fidilio
 * Date: 1-dic-2008
 * Time: 22.50.11
 * .... To change this template use File | Settings | File Templates.
 */
/*public*/ class CoppiaTagValore {
    // CAMPI
    boolean isTag;
    String tag;
    String valore;
    // COSTRUTTORE
    public CoppiaTagValore(String $tag, String $val, boolean
$tagOattr) {
                                            // $val NON PUO' ESSERE
MAI NE' null NE' ""
        // POICHE' IL METODO getTextValue, della classe 'XmlEngine'
        // TORNA SEMPRE UNA STRINGA VALIDA OPPURE "", mai null,
        // E POI, dal canto nostro, NON SALVIAMO MAI UNA CoppiaInteri
CONTENENTE UN VALORE ""
        // (tag o attributo che sia) <- A TAL PROPOSITO SI VEDA NEL
METODO listNodes
        // L'UTILIZZO CHE SI FA DEL METODO
leLettereDiQuestaStringaNonSonoTutteDegliSpaziBianchi
        // (SEMPRE DELLA CLASSE 'XmlEngine')
        tag    = $tag.toUpperCase().trim();
        valore = $val.toLowerCase().trim();
        isTag  = $tagOattr;
    }
    // METODI
    public String toString() {
    return "TAG: " + tag + " --> VAL = " + valore + ".. isTag = " +
isTag + "\n";
    }
    public String getTag()   { return tag;    }
    public String getValue() { return valore; }
    public boolean isTag()   { return isTag;  }
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\
\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//package prog.xml;
/**
 * Created by IntelliJ IDEA.
 * User: Giordano "Mejoro" Fidilio
 * Date: 12-gen-2009
 * Time: 19.39.07
 * .... To change this template use File | Settings | File Templates.
 */
//import java.util.ArrayList;
/*public*/ class Matrice { // extends utili.MyUtils { //extends
ArrayList<CoppiaTagValore> {
    // CAMPI
    private String nome_file;
    private ArrayList<ArrayList<CoppiaTagValore>> matrice;
    // COSTRUTTORE
    public Matrice(String $file_name) {
        nome_file = $file_name;
        matrice = new ArrayList<ArrayList<CoppiaTagValore>>();
    }
    // METODI
    public String fileName() {
    return nome_file;
    }
    public void add(int $n, ArrayList<CoppiaTagValore> $arr) {
        matrice.add($n, $arr);
    }
    public void showMatrice() { //
ArrayList<ArrayList<CoppiaTagValore>> $matrice) {
        for (int m = 0; m < matrice.size(); m++)
        {
            for (CoppiaTagValore ctv : matrice.get(m))
                System.out.println(ctv /*+ "_NUOVA COPPIA_ "*/ + "\r
\n");
            System.out.println("..... (" + m +
") .......................");
        }
    }
    public Matrice checkMatrice() {
    Matrice ref;
        if (matrice == null) {
            //errore(getClass().getName(), "La lettura dei nodi, di un
file xml, torna il valore NULL");
            ref = null; //return null;
        }
        else
        {
            if (matrice.size() == 0)
            {
                //errore(getClass().getName(), "Sono stati letti 0
nodi da un file xml");
                ref = null;
            }
            else
            ref = this; //return this
        }
    return ref;
    }
    public int size() {
    return matrice.size();
    }
    public ArrayList<CoppiaTagValore> get(int $i) {
    return matrice.get($i);
    }
}

mammina mi ha insegnato che non si ripetono le parole degli altri...
tié

 Qual era quella mamma che è sempre incinta... ?
La tua... attenzione "Guapo" che adesso stai sforando di brutto