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 <b>Section</b></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 -