Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2000
    Messaggi
    6

    [JAVA -XML] quando scrivo mi cancella la dtd

    Ogni volta che vado a scrivere un file xml mi viene cancellata la dichiarazione dtd, aiuto plz =)
    la funzione che uso per scrivere è la seguente
    public void scriviFileXml()
    {
    try
    {
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer serializer = transformerFactory.newTransformer();
    serializer.transform(new DOMSource(document), new StreamResult (new FileOutputStream(fileXml)));

    fileXml = new File(fileXml.getPath());

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    builder.setErrorHandler(null);
    document = builder.parse(fileXml);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }

  2. #2
    Ho lo stesso problema anche io.. Qualcuno ha trovato una soluzione?

    Più che altro non riesco proprio a leggere il contenuto del DTD dal file XML e se ci provo ottengo risultati molto strani..

    Posto qui il mio codice
    codice:
     Document doc=null;
     String filename=file;
    
     DocumentBuilder db = null;
     DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    
     try {
       db = dbf.newDocumentBuilder();
     } catch (ParserConfigurationException pce) {  }
    
     try {
       doc = db.parse(new File(filename));
     } catch (SAXException se){
     } catch (IOException ioe){ System.err.println(ioe);  }
    
     // Cerca il primo ELEMENT TYPE
     boolean cerca=true;
    
     Node child = doc.getFirstChild();
    
     short typeret = child.getNodeType();
     while (cerca)
     {
       if (typeret != Node.ELEMENT_NODE){
    
        out.print(child.toString()); //CON QUESTO COMANDO DOVREBBE STAMPARE ANCHE IL DTD
        child = child.getNextSibling();
        typeret = child.getNodeType();
       
       }else   cerca = false;
     }
    
    /*PARTE IN CUI ELABORO IL DOCUMENTO, TOLTA PERCHE' ININFLUENTE PER L'ESEMPIO*/
    
    
    //Stampa del documento modificato(successivamente potrei stampare dove voglio)
      out.println(child.toString());

  3. #3
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Ho avuto anch'io lo stesso problema tempo fa.

    Si risolve chiamando il metodo setOutputProperty del transformer. Le proprietà possibili sono nella classe OutputKeys

    Linux user number 403381

    Stop TCPA!

  4. #4
    Originariamente inviato da Fox82
    Ho avuto anch'io lo stesso problema tempo fa.

    Si risolve chiamando il metodo setOutputProperty del transformer. Le proprietà possibili sono nella classe OutputKeys

    Questo con DOM. Se si usa JDom basta usare il metodo setDocType della classe org.jdom.Document
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Originariamente inviato da Fox82
    Ho avuto anch'io lo stesso problema tempo fa.

    Si risolve chiamando il metodo setOutputProperty del transformer. Le proprietà possibili sono nella classe OutputKeys

    Ehm.. saresti così gentile da farmi un piccolo esempio che non ho proprio capito come fare?
    Ho provato a leggere quanto scritto sul sito della sun, solo che io e l'inglese siamo ancora in guerra

    Se serve questo è il primo pezzo del file XML in cui è presente il DTD
    codice:
    <?xml version="1.0"?>
    <!DOCTYPE UTENTI SYSTEM "utenti.dtd">
    <UTENTI>....
    Ps. purtroppo non posso usare JDom, per motivi come si può dire.. scolastici..

  6. #6
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Aggiungi queste righe dopo aver creato il serializzatore:

    codice:
    // La codifica del file xml
    serializer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
     
    // la dtd in questo caso locale
    // avresti potuto usare DOCTYPE_PUBLIC
    serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,"users.dtd");
    
    // specifica se identare il documento
    serializer.setOutputProperty(OutputKeys.INDENT,"yes");
    Linux user number 403381

    Stop TCPA!

  7. #7
    Innanzitutto grazie ancora per la disponibilità

    :master: comunque sia.. nel tuo esempio l'informazione "users.dtd" la dovrei conoscere a priori..

    Il mio problema è che purtroppo tale informazione non la dovrei conoscere in fase di programmazione, bensì dovrei prenderla direttamente dal file XML.

    Ora provo a spiegare quello che devo fare, probabilmente il mio procedimento è sbagliato a monte.

    Dato un file XML, il mio programma potrà aggiungere, modificare o cancellare i nodi presenti, e successivamente risalvare il tutto nel file XML.

    Per la modifica delle informazioni, al momento non ho riscontrato problemi e utilizzo alcune funzioni della classe Node.

    Il problema si presenta quando devo salvare fisicamente queste modifiche, provando a leggere i dati contenuti nei nodi con il metodo toString(), riesco a copiare nel nuovo file ogni cosa DTD escluso.

    Da qui la mia richiesta su come riuscire a leggere e copiare anche il DTD.

    PS. un'idea non troppo elegante che mi è venuta è quella di aprire il mio file XML come se fosse un normale file di testo, salvarmi le prime due righe e ricopiarle nel nuovo file.

  8. #8
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Non vorrei dire sciocchezze, sono anni che non uso Java.

    Non potresti usare il metodo getDoctype() della classe Document? Ti restituisce un oggetto che ha tutte le informazioni che ti interessano, da lì ricavi il nome della dtd e lo setti nel serializzatore.

    Il riferimento nelle API (devi sforzarti di usarla anche se è in inglese)

    http://java.sun.com/j2se/1.4.2/docs/.../Document.html
    Linux user number 403381

    Stop TCPA!

  9. #9
    Ora sto facendo delle prove di vario genere, anche se purtroppo fino ad ora non ho ottenuto risultati...

    In qualsiasi modo io tenti di stampare il DTD ottengo sempre questa stringa org.apache.crimson.tree.Doctype@12d96f2 (gli ultimi numeri sono variabili..) qualcuno ha idea di cosa sia?

  10. #10
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Dovrebbe essere nomeclasse@indirizzo-di-memoria-in-cui-è-allocata-l'istanza-corrente

    Per accedere alle informazioni dell'oggetto usa i metodi specifici (come sempre vedi API )
    Linux user number 403381

    Stop TCPA!

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.