2010-08-26 10 views
0

Ce codeXML à partir DataTable LINQ

XmlDataDocument xmlDataDocument = new XmlDataDocument(ds); 

ne fonctionne pas pour moi, parce que les noms des noeuds sont dérivés des colonnes propriété ColumnName codées et ressembleront « last_x20_name », par exemple. Ce que je ne peux pas utiliser dans la feuille de calcul Excel qui en résulte. Afin de traiter les noms de colonne pour les rendre plus conviviaux, j'ai besoin de générer le XML moi-même.

J'aime LINQ to XML, et l'une des réponses à this question contenait les extraits suivants:

XDocument doc = new XDocument(new XDeclaration("1.0","UTF-8","yes"), 
new XElement("products", from p in collection 
select new XElement("product", 
    new XAttribute("guid", p.ProductId), 
    new XAttribute("title", p.Title), 
    new XAttribute("version", p.Version)))); 

L'objectif ensemble est d'obtenir dynamiquement les noms de colonnes de l'ensemble de données, afin de les coder en dur est pas une option . Cela peut-il être fait avec Linq et sans faire le code beaucoup plus longtemps?

+0

Pourquoi avez-vous des espaces dans vos noms de colonnes? Résolvez cela, et vous avez résolu le problème. –

+0

J'ai besoin de manipuler les noms de colonnes, et je voudrais le faire de manière générique afin que je puisse réutiliser le code. Votre commentaire était le plus inutile. – cdonner

Répondre

1

J'apprécie les réponses, mais je devais abandonner cette approche tout à fait. J'ai réussi à produire le XML que je voulais (mais pas avec Linq), mais il y a une raison pour laquelle l'implémentation par défaut du constructeur XmlDataDocument utilise le EncodedColumnName - à savoir que les caractères spéciaux ne sont pas autorisés dans les noms d'éléments en XML . Mais comme je voulais utiliser le format XML pour convertir un simple fichier CSV au format XML Spreadsheet en utilisant XSLT (le client se plaint de perdre les 0 en code postal, etc. lors du chargement du fichier CSV original dans Excel), j'ai dû vérifier façons qui préservent les données dans Excel. Mais le but ultime de ceci est de produire un fichier CSV à télécharger sur le processeur de paie, et ils exigent que les noms de colonne soient quelque chose qui ne soit pas conforme à XML (par exemple "Fichier #"). Les données sont examinées par les humains avant le téléchargement, et ils utilisent Excel.

J'ai eu recours à coder en dur les noms de colonne dans le XSLT après tout.

+0

bonne réponse. J'ai eu quelque chose de similaire à la base de données des villes pour exceller – Luke101

2

Cela devrait être possible.

Pour utiliser votre jeu de données en tant que source, vous avez besoin de Linq-to-Dataset.

Ensuite, vous avez besoin d'une requête imbriquée

// untested 
var data = new XElement("products", 
    from row in ds.Table["ProductsTable"].Rows.AsEnumerable() 
    select new XElement("product", 
    from column in ds.Table["ProductsTable"].Columns // not sure about this 
    select new XElement(colum.Fieldname, rows[colum.Fieldname]) 
    )); 
+0

La collection Columns n'est pas interrogeable et AsEnumerable() n'est pas défini pour cela, donc je suppose que cela ne peut pas être fait sans connaître les noms des colonnes. – cdonner

+2

Il suffit d'aller Columns.Cast () –