384 messaggi dal 26 agosto 2007
Ciao vi spiego brevemente cosa devo fare. Ho un database SQL Server e da codice faccio una query per leggere i dati e li salvo su un XmlReader. Il problema viene quando cerco di salvare l'XmlReader in un documento perchè SQL Server mi restituisce un XML di questo tipo:
<row>
   <Colonna1/>
   <Colonna2/>
</row>
<row>
   <Colonna1/>
</row>

Quando cerco di salvarlo in un documento giustamente mi dice che non possono esistere due elementi radice. Ho provato a fare così ma il file che mi salva è vuoto:
SqlConnection Conn = new SqlConnection();
            SqlCommand Cmd = new SqlCommand();
            XmlDocument doc = new XmlDocument();
            string Query = "SELECT * FROM db_datawriter.Articoli FOR XML PATH";
            Conn.ConnectionString = "Stringa di connessione";
            Conn.Open();
            Cmd.CommandType = CommandType.Text;
            Cmd.Connection = Conn;
            Cmd.CommandText = Query;
            XmlReader Read = Cmd.ExecuteXmlReader();
            Conn.Close();
            XmlElement Vetrina = doc.CreateElement("Vetrina");
            Vetrina.InnerXml = Read.ReadInnerXml();
            doc.AppendChild(Vetrina);
            doc.Save(Server.MapPath("vetrina.xml"));

Come posso fare? Grazie!!

Lunga vita e prosperità!!
438 messaggi dal 04 agosto 2002
Contributi
devi prima creare un root element con nome a piacere quindi a fare l'appendchild del root poi fai l'appendchild del tuo Vetrina sull'elemento root.

ciao ciao
384 messaggi dal 26 agosto 2007
Ok ma quello che non riesco a fare è proprio appendere tutti gli elementi 'row' dal XmlReader e appenderli nell'elemento Vetrina che poi a sua volta verrà appeso come DocumentElement nel XmlDocument. Potresti farmi un piccolo esempio? Grazie..
Modificato da voyager18 il 23 luglio 2008 12.12 -

Lunga vita e prosperità!!
384 messaggi dal 26 agosto 2007
Chi mi sa aiutare??

Lunga vita e prosperità!!
41 messaggi dal 19 febbraio 2007
Credo il problema sia dovuto all'assenza del nodo radice nell' XML in output dal DB.
XmlReader.ReadInnerXML() restituisce una stringa vuota quando non riesce a trovare un nodo radice da cui estrapolare l'"InnerXML".
384 messaggi dal 26 agosto 2007
E come posso fare allora??

Lunga vita e prosperità!!
41 messaggi dal 19 febbraio 2007
Potresti utilizzare un oggetto SqlDataReader in modo da farti restituire le colonne che ti interessano come sottoforma di string.
Per ottenere un unica stringa XML puoi utilizzare un oggetto StringBuilder.

Ad esempio:

StringBuilder xmlString = new StringBuilder();

using(IDataReader rd = TuoSqlCommand.ExecuteReader())
{
while(rd.Read())
{
xmlString.Append(rd["<nome-colonna-dati-xml>"];
}

rd.close();
}

In questo modo chiamando xmlString.ToString() dovresti ottenere una unica stringa contenente i dati XML che ti interessano.
A questo punto procedi come hai già fatto.

Spero ti risolva il problema :)
384 messaggi dal 26 agosto 2007
Ho risolto così:
SqlConnection Conn = new SqlConnection();
            SqlCommand Cmd = new SqlCommand();
            XmlDocument OggettiInVetrina = new XmlDocument();
            string Query = "SELECT * FROM Tabella FOR XML PATH, ROOT('Vetrina')";
            Conn.ConnectionString = "Connessione";
            Conn.Open();
            Cmd.CommandType = CommandType.Text;
            Cmd.Connection = Conn;
            Cmd.CommandText = Query;
            XmlReader Read = Cmd.ExecuteXmlReader();
            Conn.Close();
            OggettiInVetrina.Load(Read);
            Random Rnd = new Random();
            XmlElement RootVetrina = OggettiInVetrina.CreateElement("Rootvetrina");
            int i;
            ArrayList Row = new ArrayList();
            for (i = 0; i < OggettiInVetrina.DocumentElement.ChildNodes.Count; i++)
            {
                Row.Add(OggettiInVetrina.DocumentElement.ChildNodes[i]);
            }
            for (i = 0; i < 9; i++)
            {
                RootVetrina.AppendChild((XmlElement)Row[Rnd.Next(Row.Count - 1)]);
            }
            XmlDocument Vetrina = new XmlDocument();
            Vetrina.AppendChild(RootVetrina);
            Vetrina.Save(Server.MapPath("prova.xml"));

Però ora quando vado a fare RootVetrina.AppenaChild mi da questo errore:
The node to be inserted is from a different document context.

Che vuol dire??

Lunga vita e prosperità!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.