3 messaggi dal 07 marzo 2015
Ciao a tutti!
Ho un piccolo problemino con la modifica di un XML.
Per gestire dei contenuti "una tantum", senza sprecare risorse esose, tipo un database SQL, ho pensato bene di sfruttare un file XML.

Ho il mio bel file XML formattato e pettinato, ma, ahimé, contiene un tag al cui interno è contenuto dell'HTML. Per motivi di praticità e non solo, il contenuto del tag è stato incapsulato in una sezione CDATA.

Generare il tutto non è un problema. Il problema arriva quando si deve fare un aggiornamento del file.
L'unica soluzione che mi è venuta in mente...usare una griglia...e quindi, agganciare il file e infilarlo in un DataSet, recuperare l'id della riga selezionata e procedere all'aggiornamento...

Questo è il codice che uso:
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/Content/XMLs/News.xml"));
int xmlRow = Convert.ToInt32((Convert.ToString(hdfRowState.Value))); //Hiddenfield to retrieve the selected row
ds.Tables[0].Rows[xmlRow]["tite"] = txtTitleNews.Text;
ds.Tables[0].Rows[xmlRow]["content"] = txtContentNews.Text; //Questo lo gradirei in una sezione CDATA!
ds.Tables[0].Rows[xmlRow]["imgURL"] = txtImgUrl.Text;
ds.Tables[0].Rows[xmlRow]["dateNews"] = txtDateNews.Text;
ds.WriteXml(Server.MapPath("~/Content/XMLs/News.xml"));


Il salvataggio si "mangia" la sezione CDATA...e viene sostituito il tutto con caratteri speciali html...

XML prima dell'update:
<?xml version="1.0" standalone="yes"?>
<Notizie>
  <news>
    <ID>1</ID>
    <title>titolo 2</title>
    <content><![CDATA[cDATA <b>Section</b>]]></content>
    <imgURL>/Content/Images/News/Default.png</imgURL>
    <dateNews />
  </news>
</Notizie>

XML dopo l'update:
<?xml version="1.0" standalone="yes"?>
<Notizie>
  <news>
    <ID>1</ID>
    <title>titolo 2</title>
    <content>cDATA &lt;b&gt;Section&lt;/b&gt;</content>
    <imgURL>/Content/Images/News/Default.png</imgURL>
    <dateNews />
  </news>
</Notizie>

Peggio ancora se apro un'istanza del XmlDocument e procedo a ricreare la sezione cDATA:
XmlDocument xmlNews = new XmlDocument();
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/Content/XMLs/News.xml"));
int xmlRow = Convert.ToInt32((Convert.ToString(hdfRowState.Value)));
ds.Tables[0].Rows[xmlRow]["title"] = txtTitleNews.Text;
ds.Tables[0].Rows[xmlRow]["content"] = xmlNews.CreateCDataSection(txtContentNews.Text).OuterXml; //lo voglio in CDATA!
ds.Tables[0].Rows[xmlRow]["imgURL"] = txtImgUrl.Text;
ds.Tables[0].Rows[xmlRow]["dateNews"] = txtDateNews.Text;
ds.WriteXml(Server.MapPath("~/Content/XMLs/News.xml"));

Il risultato è peggio di prima (anche i tag <![CDATA[ ]> vengono convertiti in caratteri html...).

Per quanto riguarda l'aggiunta di una nuova news, il codice è (lo taglio per risparmiare spazio) il seguente:

XmlDocument xmlNews = new XmlDocument();
xmlNews.Load(Server.MapPath("~/Content/XMLs/News.xml"));
XmlElement fatherElement = xmlNews.CreateElement("news");
XmlElement ID = xmlNews.CreateElement("ID");
ID.InnerText = SetNewNodeId().ToString(); //txtID.Text
XmlElement title = xmlNews.CreateElement("title");
title.InnerText = txtTitleNews.Text;
XmlElement content = xmlNews.CreateElement("content");
XmlCDataSection cDdta = xmlNews.CreateCDataSection(txtContentNews.Text);
content.InnerXml = cDdta.OuterXml;
//and so on...
xmlNews.Save(Server.MapPath("~/Content/XMLs/News.xml"));


Ovviamente...è 'sto benedetto DataSet e i suoi metodi che non son proprio ad hoc...o sbaglio?
Ci sono alternative? Ho proprio necessità che rimanga tutto in HTML chiaro (viene generato tutto da un editor HTML)...e che venga caricato paro paro tutte le volte...
Qualcuno può darmi una mano?
Modificato da Alocin82 il 06 settembre 2015 21.59 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

Alocin82 ha scritto:

Ovviamente...è 'sto benedetto DataSet e i suoi metodi che non son proprio ad hoc...o sbaglio?

Puoi appoggiarti ad una classe helper tipo quella che puoi scaricare da questo esempio.
http://www.xmlforasp.net/codesection.aspx?csID=101
C'è anche una live demo in cui vedi la differenza nell'XML prodotto con e senza l'intervento di quella classe.
Così però secondo me ti diventa inutilmente complicato. Tanto vale agire direttamente sull'XmlDocument, anche quando si tratta di aggiornare i dati.

Guarda questo esempio. Ho spostato l'id della notizia sul nodo news, come suo attributo. In questo modo mi è molto semplice selezionare il nodo voluto grazie ad una query XPath tipo "/Notizie/news[@id=1]".
https://dotnetfiddle.net/C0dIjX

Per visualizzare i dati dal documento XML nella GridView (o ListView), puoi anche fare a meno del dataset ed usare invece un XmlDataSource come vedi qui.
http://www.codeproject.com/Articles/10898/Introduction-to-XMLDataSource-control-in-ASP-NET

ciao,
Moreno
Modificato da BrightSoul il 12 settembre 2015 00.46 -

Enjoy learning and just keep making

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.