2010-10-02 7 views
2

Est-il possible d'utiliser des variables telles que <%=person.LastName %> dans la chaîne XML de cette façon?LINQ vers SQL vers XML (en utilisant des littéraux XML en C#)

XElement letters = new XElement("Letters"); 

XElement xperson = XElement.Parse("<Table><Row><Cell><Text> 
    <Segment>Dear <%=person.Title%> <%=person.FirstName%> <%=person.LastName%>, 
    </Segment></Text></Cell></Row>..."); 

foreach (Person person in persons){ 
    letters.Add(xperson) 
} 

S'il est possible, ce serait une bouée de sauvetage puisque je ne peux pas utiliser XElement et XAttribute pour ajouter les nœuds manuellement. Nous avons plusieurs modèles et ils changent fréquemment (modifier à la volée).

Si ce n'est pas faisable, pouvez-vous penser d'une autre manière afin que je puisse utiliser des modèles pour le XML?

Regardez comme il est possible dans VB http://aspalliance.com/1534_Easy_SQL_to_XML_with_LINQ_and_Visual_Basic_2008.6

+1

Qu'est-ce que cela a à voir avec LINQ to SQL? – svick

Répondre

1

Ceci est une caractéristique exclusive de VB.NET connu sous le nom XML Literals. Il a été ajouté dans VB 9.0. C# ne prend pas actuellement en charge cette fonctionnalité. Bien que Microsoft ait déclaré son intent to bridge the gap entre les langues dans le futur, il n'est pas clair si cette fonctionnalité sera bientôt disponible en C#.

Votre exemple ne me semble pas clair. Vous voudriez avoir la boucle foreach avant d'analyser le XML réel puisque les valeurs sont liées à l'objet Person actuel. Par exemple, voici un exemple VB de littéraux XML:

Dim xml = <numbers> 
      <%= From i In Enumerable.Range(1, 5) 
       Select <number><%= i %></number> 
      %> 
      </numbers> 

For Each e In xml.Elements() 
    Console.WriteLine(e.Value) 
Next 

L'extrait ci-dessus construit le code XML suivant:

<numbers> 
    <number>1</number> 
    <number>2</number> 
    <number>3</number> 
</numbers> 

Ensuite, il écrit 1, 2, 3 à la console.

Si vous ne pouvez pas modifier votre code C# pour générer dynamiquement le code XML, vous pouvez peut-être écrire le code qui traverse le modèle XML et rechercher des champs prédéterminés dans les attributs et les éléments. Cela signifie que vous devez parcourir tous les attributs et éléments de chaque noeud et avoir une instruction switch qui vérifie le nom du champ de modèle. Si vous rencontrez un champ de modèle et que vous êtes en train d'itérer des attributs, vous le définissez de la même façon que les attributs, alors que si vous étiez des éléments itérés, vous le définiriez comme les éléments sont définis. Ce n'est probablement pas l'approche la plus efficace, mais c'est une solution.

La solution la plus simple serait d'utiliser VB.NET. Vous pouvez toujours le développer en tant que projet autonome, ajouter une référence à la dll du projet C#, transmettre des données à la classe VB.NET et lui demander de renvoyer le code XML final.

EDIT: pour clarifier, l'utilisation de VB.NET n'ignore pas la nécessité de mettre à jour le modèle. Il vous permet de spécifier la mise en page plus facilement en tant que littéral XML. Le code doit donc être mis à jour dans VB dès que la disposition change. Vous ne pouvez pas charger un modèle XML à partir d'un fichier texte et attendre que les champs soient liés de cette façon. Pour une solution vraiment dynamique qui vous permet d'écrire le code une fois et de lire différents modèles, ma première suggestion est plus appropriée.