Grazie a tutti,
ho verificato il codice e avevo impostato quanto segue:
Inizio ciclo per scansionare un ArrayList<String> FileToOpenXML
- Apertura e parse DOM del FileToOpen(n)
- Ricerca di un nodo con TAG x
- Se trovato, inserimento del nodo in un array nodelist
fine ciclo
Generazione in scrittura di un file XML
- Inserimento nodo root
- Inserimento dei nodi sotto root presenti nel nodelist
Salvataggio del file XML
L'errore l'avevo nel ciclo for. La modifica, che sembra reggere, è quello di
1) Aprire un file in scrittura XML
2) Iniziare il ciclo come sopra
3) Se trovo il nodo, lo copio direttamente ne file XML aperto in scrittura.
Sembra funzionare ma se ciò è vero significa che quando copio un nodo (con l'intero albero) in un NodeList in realtà mantengo in memoria l'intero oggetto DOM con tutti il file originario?
Di seguito:
1) un pezzo del codice che avevo scritto (ora è modificato poichè passo anche il riferimento del file in cui scrivere i nodi:
2) L'errore avviene in getAllNodeFromArrayList()
public void OpenReadXML(String FileXML) throws ParserConfigurationException, SAXException, IOException {
if(FileXML.isEmpty()==true || FileXML.trim().length()==0) { IOException e = new IOException(); throw e; }
this._fileName = FileXML;
this._documentFactory = DocumentBuilderFactory.newInstance();
this._documentBuilder = this._documentFactory.newDocumentBuilder();
this._document = this._documentBuilder.parse(this._fileName);
this._document.getDocumentElement().normalize();
this._rootNode = this._document.getChildNodes().item(0);
this._rootNodeName = this._rootNode.getNodeName();
}
public ArrayList<Node> getAllNodeFromArrayList(ArrayList<String> InArrayFile, String RootNodeName, String TagNodeName) {
if(InArrayFile.isEmpty()==true || InArrayFile.size()==0) { return null; } //Controllo iniziale
libStreamXML XMLout = new libStreamXML(); //Istanza per aprire i file di input
ArrayList<Node> AllOutNode = new ArrayList<Node>(); //ArrayList che conterrà tutti i nodi principali del file XML di uscita
for(int i=0; i < InArrayFile.size(); i++) { //Scansione ArrayList File xml
try {
XMLout.OpenReadXML(InArrayFile.get(i)); //Apre il file 'n'.xml
Node nl = XMLout.getNode(RootNodeName); //Importa un nodelist avente TagNode
for(int k=0; k < nl.getChildNodes().getLength() ; k++) { //Scansione dei nodi figli del nodo principale
if(nl.getChildNodes().item(k).getNodeName()==TagNodeName) { //Se il nodo figlio del RootNodeName contiene il TagNodeName
AllOutNode.add(XMLout.getNode(nl.getChildNodes().item(k), TagNodeName) ); //Aggiunge il nodo figlio
}
}
} catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); }
}
return AllOutNode;
}
public org.w3c.dom.Node getNode(org.w3c.dom.Node NodeStart, String ElementName) {
if(NodeStart.getNodeName()==ElementName) { return NodeStart; } //Caso in cui l'elemento di NodeStart è l'elemento ricercato
NodeList alpha = NodeStart.getChildNodes(); //Ottiene l'elenco dei nodi figli
for(int i = 0; i<alpha.getLength(); i++) { //Avvio scansione degli elementi figli
if(alpha.item(i).getNodeName()==ElementName) { //Se l'elemento i ha il nome ricercato
return alpha.item(i); //- Ritorna il nodo dell'elemento
} else { //Oppure
if(alpha.item(i).hasChildNodes()==true) { // Se l'elemento a sua volta a nodi figli
org.w3c.dom.Node beta = getNode(alpha.item(i),ElementName); // - Richiama il metodo (ricorsivo) per cercare nell'albero
if(beta!=null) { return beta; } // Se il metodo restituisce un riferimento al nodo valido, il metodo termina
} //
} //Continua il ciclo.
}
return null;
}