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

    Commenti

    Aggiungi un nuovo commento »»»
    Per inserire un commento, devi registrarti alla nostra community.

    © 1998-2008 - naighes - Il blog di Nicola Baldi

    TagCloud
    BLOG INFO
    • Post: 9
    • Commenti: 6
    • TrackBacks: 1
    • Feed blog e contenuti tecnici: RSS
    • Feed blog: RSS Atom OPML
    CATEGORIE
    I PIÙ LETTI DEL MESE
    IN EVIDENZA