2009-08-04 6 views
0

J'essaye de lister les lacunes dans un asp: GridView en utilisant un XML_feed à travers un asp: XmlDataSource. Ce devrait être un peu simple, mais je me manque quelque chose avec mes expressions XPath ..Comment analyser le flux XML en utilisant asp: XmlDataSource et XPath

Ceci est un court exemple de ce que je suis en train de réaliser (titre de la liste des postes vacants):

<asp:XmlDataSource ID="XMLsource" DataFile="http://demo.easycruit.com/export/xml/vacancy/list.xml" XPath="VacancyList/Vacancy" runat="server"/> 
<asp:GridView DataSourceID="XMLsource" AutoGenerateColumns="False" runat="server">  
<Columns> 
     <asp:TemplateField> 
      <HeaderTemplate>Title</HeaderTemplate> 
      <ItemTemplate><%# XPath("Version/Title") %></ItemTemplate>     
    </asp:TemplateField>    
</Columns> 
</asp:GridView> 

Les deux contrôleurs ont DataBind() dans codebehind. Donc, si quelqu'un sait pourquoi ce travail doen't ... :)

Répondre

1

Si vous avez un oeil à votre XML (seulement les premières lignes):

<VacancyList generated="2009-08-04T18:43:17" 
      xmlns="urn:EasyCruit" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.easycruit.com/dtd/vacancy-list.xsd"> 
    <Vacancy id="82034" date_start="2007-04-17" date_end="2009-12-22" 
      reference_number="CDP-GR3"> 
    <Versions> 
     <Version language="fr"> 
     <Title>Chef de produit (H/F)</Title> 
     <TitleHeading/> 

Vous lier votre DataGrid à la liste de éléments - bien jusqu'à présent.

Mais dans votre grille, vous faites référence: <%# XPath("Version/Title") %>

Cela ne fonctionnera pas, car le n'a pas une collection «/inside it - these elements are within a` .....

Alors ce que vous devez référence dans votre ItemTemplate serait:

<%# XPath("Versions/Version[@language='fr']/Title") %> 

Cela devrait fonctionner.

MISE À JOUR:
il semble y avoir un problème supplémentaire avec le XmlDataSource ASP.NET 2.0 ne pas être capable de gérer les espaces de noms XML par défaut :-(

C'est cette ligne ici dans votre XML:

<VacancyList ........ 
      xmlns="urn:EasyCruit" 

Voir ce billet de blog ici sur le sujet: http://jasonf-blog.blogspot.com/2006/08/xmldatasource-xpath-workaround-for.html

Il y a vraiment deux choses que vous pouvez faire pour résoudre ce problème:

  • utiliser une transformation XSLT à bande sur l'espace de noms par défaut afin que le XmlDataSource peut gérer les données
  • charge les données de l'URL dans le code, et le lier à l'GridView dans votre code-derrière

MISE à JOUR 2: La méthode de décapage sur les espaces de noms XML semble fonctionner assez bien - le projet de loi propose Evjen cette méthode here.

Si vous enregistrez le fichier XSLT dans le poste à un fichier appelé « StripNamespaces.xslt » dans le projet de site Web, vous devriez obtenir vos données si vous changez le asp: XmlDataSource être:

<asp:XmlDataSource ID="XMLsource" runat="server" 
      DataFile="http://demo.easycruit.com/export/xml/vacancy/list.xml" 
      TransformFile="~/StripNamespaces.xslt" 
      XPath="VacancyList/Vacancy" /> 

Notez le nouveau paramètre "TransformFile" - cela doit faire référence à ce fichier XSLT. Avec cela en place, je reçois maintenant des données affichées dans le GridView.

Marc

Questions connexes