DataSet.ReadXml() e spazi dei nomi.
Ieri ho provato a consumare uno dei feed RSS di aspitalia.
Il primo approccio che ho seguito e' stato il seguente:
DataSet ds = new DataSet();
ds.ReadXML("http://feed.aspitalia.com/feed_articoli.xml");
this.Repeater1.DataSource = ds.Tables["item"].DefaultView();
this.Repeater1.DataBind();
Mando in esecuzione e vedo che viene generata un'eccezione.
Questo succede perche' il metodo ReadXML del DataSet ignora gli spazi dei nomi e tenta di creare due colonne con lo stesso nome.
<slash:comments>...</slash:comments>
<wfw:comments>...</wfw:comments>
Inizialmente, avevo pensato di risolvere la questione nel seguente modo:
protected DataTable CreateTable()
{
DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn("title");
dt.Columns.Add(dc1);
DataColumn dc2 = new DataColumn("data");
dt.Columns.Add(dc2);
DataColumn dc3 = new DataColumn("link");
dt.Columns.Add(dc3);
DataColumn dc4 = new DataColumn("description");
dt.Columns.Add(dc4);
DataColumn dc5 = new DataColumn("author");
dt.Columns.Add(dc5);
return dt;
}
protected void BindRepeater()
{
DataTable dt = CreateTable();
string url = "http://feed.aspitalia.com/feed_articoli.xml";
XmlDocument doc = new XmlDocument();
doc.Load(url);
XmlNodeList items = doc.DocumentElement["channel"].SelectNodes("item");
foreach(XmlNode node in items)
{
if (node.LocalName == "item")
{
DataRow dr = dt.NewRow();
dr["title"] = node.ChildNodes[0].InnerXml;
dr["link"] = node.ChildNodes[1].InnerXml;
dr["data"] = node.ChildNodes[2].InnerXml;
dr["description"] = node.ChildNodes[3].InnerXml;
dr["author"] = node.ChildNodes[4].InnerXml;
dt.Rows.Add(dr);
}
}
this.Repeater1.DataSource = dt.DefaultView;
this.Repeater1.DataBind();
}
Poi ho trovato invece un approccio piu' elegante che fa uso della classe XmlTransform.
Si inizia creando l'XSLT da applicare.
Una cosa del genere:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:for-each select="rss">
<xsl:for-each select="channel">
<rssItems>
<xsl:for-each select="item">
<item>
<title><xsl:value-of select="title"/></title>
<link><xsl:value-of select="link"/></link>
<description><xsl:value-of select="description"/></description>
<author><xsl:value-of select="//item/dc:creator" /></author>
</item>
</xsl:for-each>
</rssItems>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:transform>
Ed ecco il codice C#:
// leggo il contenuto del feed con un reader
XmlTextReader rd = new XmlTextReader("http://feed.aspitalia.com/feed_articoli.xml");
XslTransform tf = new XslTransform();
// Carico il modello XSLT
tf.Load(Request.PhysicalApplicationPath + "MyXslt.xslt");
StringWriter wr = new StringWriter();
XPathDocument aXPath = new XPathDocument(rd);
// Applico il modello
tf.Transform(aXPath, null, wr, null);
rd.Close();
wr.Close();
// Creo il DataSet
StringReader sr = new StringReader(wr.ToString());
DataSet ds = new DataSet();
ds.ReadXml(sr);
sr.Close();
//Binding
this.Repeater1.DataSource = ds.Tables[0].DefaultView;
this.Repeater1.DataBind();
Spero che a qualcuno possa essere di aiuto.
Nella stessa categoria
Nessuna risorsa collegata
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




Stampa
Download
10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!