Autore Topic: Creare file xml tramite DOM  (Letto 2760 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Creare file xml tramite DOM
« il: 17 Ottobre 2010, 11:44:35 CEST »
0
Ciao io vorrei creare un file xml con una sintassi simile a quella proposta in questo post
Codice (XML): [Seleziona]
<messages>
        <note id="p501">
          <to>Carlo</to>
          <from>Luca</from>
          <heading>Promemoria</heading>
          <body>Ricordati gli appunti!</body>
        </note>
       
        <note id="p502">
          <to>Luca</to>
          <from>Carlo</from>
          <heading>Re: Promemoria</heading>
          <body>Ok, mi ricorderò!</body>
        </note>
</messages>

Nel mio caso quello che vorrei ottenere io è la seguente sintassi:

Codice (XML): [Seleziona]
<listaspesa>
        <articolo>
            <id>1</id>
            <nome>carne</nome>
            <quantita>5</quantita>
         </articolo>

        <articolo>
            <id>2</id>
            <nome>pesce</nome>
            <quantita>3</quantita>
         </articolo>

</listaspesa>
       

Io non riesco a creare la sotto root <articolo>.
Mi da un problema di gerarchie quando ci provo.

il mio codice java è il seguente:

Codice (Java): [Seleziona]
import java.io.*;
import org.w3c.dom.*;

public class xmlserialize2 {

        public static void main (String[] args) throws IOException, SQLException, ClassNotFoundException {
               
                Element e = null;
                Element e2 = null;
                Element e3 = null;
                Element e4 = null;
               
            Node n = null;
            Node n2 = null;
            Node n3 = null;
            Node n4 = null;
               
                Element root = xmldoc.createElement("LISTA_SPESA");
                Vector<LogSpesaBean> VetProva3 = LogSpesaDB.getLogSpesaPROVA(DBConnection.getBDConnection().getConnection());
               
                for(int j=0; j<VetProva3.size(); j++)
                        {
                        LogSpesaBean frova= VetProva3.get(j);
                        int[] idarti = {frova.getIDArticolo()};
                        String[] nomearti = {frova.getNome()};
                        int[] quantarti = {frova.getQta()};
               
                                for (int i=0;i<idarti.length;i++)
                                        {
                                                // Child i.
               
                                        e2 = xmldoc.createElementNS(null, "ID_ARTICOLO");
                                        n2 = xmldoc.createTextNode(String.valueOf(idarti[i]));
                                        e2.appendChild(n2);
                                       
                                        e3 = xmldoc.createElementNS(null, "NOME_ARTICOLO");
                                        n3 = xmldoc.createTextNode(nomearti[i]);
                                        e3.appendChild(n3);
                                       
                                        e4 = xmldoc.createElementNS(null, "QUANTITA");
                                        n4 = xmldoc.createTextNode(String.valueOf(quantarti[i]));
                                        e4.appendChild(n4);
                                       
                                        root.appendChild(e2);
                                        root.appendChild(e3);
                                        root.appendChild(e4);  
                                       
                                        }
                               
                        }
               
                xmldoc.appendChild(root);
               
                FileOutputStream fos = new FileOutputStream("users2.xml");
                // XERCES 1 or 2 additionnal classes.
                OutputFormat of = new OutputFormat("XML","ISO-8859-1",true);
                of.setIndent(1);
                of.setIndenting(true);
                of.setDoctype(null,"users3.dtd");
                XMLSerializer serializer = new XMLSerializer(fos,of);
                // As a DOM Serializer
                serializer.asDOMSerializer();
                serializer.serialize(xmldoc.getDocumentElement());
                fos.close();
               
        }
                }


Spero di essere stato chiaro. Ho fatto mille tentativi ma tutti andati a male perchè mi da sempre l'errore di gerarchia sulle root, dicendomi che ne esiste più di una principale ma io vorrei una sottoroot articolo.
Grazie mille in anticipo.
Ciao.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #1 il: 17 Ottobre 2010, 11:57:31 CEST »
0
Io per creare file xml utilizzo un altro approccio:

Codice (Java): [Seleziona]
public String buildXml(Command command){

        XmlSerializer serializer = Xml.newSerializer();
        StringWriter writer = new StringWriter();
       
        try {
                serializer.setOutput(writer);
                serializer.startDocument("UTF-8", true);

                serializer.startTag("", XmlTag.MESSAGE);
                serializer.attribute("", "seq", String.valueOf(command.getSequenceNumber()));
                serializer.startTag("", XmlTag.SET_PROPERTY_COMMAND);

                addTagAndValue(serializer, XmlTag.DEVICE_ID, command.getDeviceId());
                addTagAndValue(serializer, XmlTag.PROPERTY_NAME, command.getPropertyName());
                addTagAndValue(serializer, XmlTag.VALUE, command.getPropertyValue());

                serializer.endTag("", XmlTag.SET_PROPERTY_COMMAND);
                serializer.endTag("", XmlTag.MESSAGE);

                serializer.endDocument();
                return writer.toString();
        } catch (Exception e) {
                throw new RuntimeException(e);
        }
       
}

protected void addTagAndValue(XmlSerializer serializer, String tag, String value)
                throws Exception {
        serializer.startTag("", tag);
        serializer.text(value);
        serializer.endTag("", tag);
}

ottengo una cosa del genere
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="UTF-8"?>
<Message seq="0">
        <SetPropertyCommand>
                <DeviceId>DeviceId</DeviceId>
                <PropertyName>PropertyName</PropertyName>
                <Value>Value</Value>
        </SetPropertyCommand>
</Message>

ovviamente poi ho definito anche dei campi che rappresentano i nomi dei tag.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #2 il: 17 Ottobre 2010, 13:37:31 CEST »
0
Io volevo mantenere il mio codice senza stravolgere il tutto...io mi rifaccio alla tecnica di serializzazone Xerces:
Tutorial : XML generation with Java

volevo capire come poter aggiungere una sottoroot come precisato nel mio post sopra inserito....
se qualquno riesce a darmi una mano ne sono molto grato...thanks...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #3 il: 17 Ottobre 2010, 14:12:53 CEST »
0
volevo capire come poter aggiungere una sottoroot come precisato nel mio post sopra inserito....

Basta che alla root appendi un figlio articolo e poi a questo appendi i nodi id, nome e quantità.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #4 il: 17 Ottobre 2010, 18:33:30 CEST »
0
Ci ho provato ma nulla da fare...SOMEBODY CAN HELP ME?? grazie...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #5 il: 17 Ottobre 2010, 18:49:52 CEST »
0
Ci ho provato ma nulla da fare...SOMEBODY CAN HELP ME?? grazie...

Non mi sembra che nel codice che hai postato fai come ti ho suggerito.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #6 il: 17 Ottobre 2010, 23:43:10 CEST »
0
Ecco il codice:
Codice (Java): [Seleziona]
import java.awt.Button;
import java.awt.List;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.xml.bind.annotation.XmlElement;


import agenda.bean.*;
import agenda.database.*;
import agenda.utility.*;

import java.io.*;
import org.w3c.dom.*;



import org.apache.xerces.dom.DocumentImpl;
import org.apache.xml.serialize.*;

public class xmlserialize3 {

        public static void main (String[] args) throws IOException, SQLException, ClassNotFoundException {
               
               
                Element e = null;
                Element e2 = null;
                Element e3 = null;
                Element e4 = null;
       
               
            Node n = null;
            Node n2 = null;
            Node n3 = null;
            Node n4 = null;
         
           
                // Document (Xerces implementation only).
                Document xmldoc= new DocumentImpl();
                // Root element.
                Element root = xmldoc.createElement("LISTA_SPESA");
               
               

                Vector<LogSpesaBean> VetProva3 = LogSpesaDB.getLogSpesaPROVA(DBConnection.getBDConnection().getConnection());
               
               
               
                for(int j=0; j<VetProva3.size(); j++)
                        {
                        LogSpesaBean frova= VetProva3.get(j);
                        int[] idarti = {frova.getIDArticolo()};
                        String[] nomearti = {frova.getNome()};
                        int[] quantarti = {frova.getQta()};
               
                   
                       
                                for (int i=0;i<idarti.length;i++)
                                        {
                                                // Child i.
                                       
                                       
                                        Node n5 = xmldoc.createTextNode("<ARTICOLO>");
                                        root.appendChild(n5);
                                       
                                       
                                        e2 = xmldoc.createElementNS(null, "ID_ARTICOLO");
                                        n2 = xmldoc.createTextNode(String.valueOf(idarti[i]));
                                        e2.appendChild(n2);
                                        n5.appendChild(e2);
                                       
                                        e3 = xmldoc.createElementNS(null, "NOME_ARTICOLO");
                                        n3 = xmldoc.createTextNode(nomearti[i]);
                                        e3.appendChild(n3);
                                        n5.appendChild(e3);
                                       
                                        e4 = xmldoc.createElementNS(null, "QUANTITA");
                                        n4 = xmldoc.createTextNode(String.valueOf(quantarti[i]));
                                        e4.appendChild(n4);
                                        n5.appendChild(e4);    
                                       
                                        Node n6 = xmldoc.createTextNode("</ARTICOLO>");
                                        root.appendChild(n6);
                                       
                                       
                                       
                                   
                                       
                                       
                                       
                                                        //e.setAttributeNS(null, "ID_ARTICOLO", String.valueOf(idarti[i]));
                                                        //e.setAttributeNS(null, "NOME_ARTICOLO", nomearti[i]);
                                                        //e.setAttributeNS(null, "QUANTITA", String.valueOf(quantarti[i]));
                                                        //n = xmldoc.createTextNode(nomearti[i]);
                                                       
                                                        //e.appendChild(n);
               
                                                        //root.appendChild(e);
                                        }
                               
                        }
               
               
               
                xmldoc.appendChild(root);

               
               
               
               
                FileOutputStream fos = new FileOutputStream("users2.xml");
                // XERCES 1 or 2 additionnal classes.
                OutputFormat of = new OutputFormat("XML","ISO-8859-1",true);
                of.setIndent(1);
                of.setIndenting(true);
                of.setDoctype(null,"users3.dtd");
                XMLSerializer serializer = new XMLSerializer(fos,of);
                // As a DOM Serializer
                serializer.asDOMSerializer();
                serializer.serialize(xmldoc.getDocumentElement());
                fos.close();
               
               
               
        }
                }

L'errore che mi da è il seguente:

Exception in thread "main" org.apache.xerces.dom.DOMExceptionImpl: DOM006 Hierarchy request error
   at org.apache.xerces.dom.NodeImpl.appendChild(NodeImpl.java:369)
   at xmlserialize3.main(xmlserialize3.java:82)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #7 il: 18 Ottobre 2010, 00:41:41 CEST »
0
Beh non credo che articolo sia un textNode. Hai provato con createElementNS? Poi non credo che t debba esplicitamente chiudere il tag. Ma non ho mai usato questa implementazione percui non saprei darti altre info.
Comunque questo non mi sembra un problema relativo ad Android. O Sbaglio?

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creare file xml tramite DOM
« Risposta #8 il: 18 Ottobre 2010, 10:39:46 CEST »
0
Non è un problema di android direttamente ma poi io di questo file xml che vado a creare devo fare il parsing tramite DOM..

Offline ilGiudicatore

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg p500
  • Sistema operativo:
    windows Xp, eclipse
Re:Creare file xml tramite DOM
« Risposta #9 il: 22 Marzo 2012, 09:49:30 CET »
0
Buon Giorno! non è che potete consigliarmi un BUON tutorial che spieghi come creare un file xml da android??? GRAZIE! Andrea