2010-02-25 5 views
1

j'ai le code XML suivant passé en IQueryable à une méthode, à savoirLINQ to XML, remplacer les nœuds enfants mais gardez l'état

XML:

<body> 
    <p>Some Text</p> 
    <p>Some Text</p> 
    <pullquote>This is pullquote</pullquote> 
    <p>Some Text</p> 
    <p>Some Text</p> 
<body> 

Méthode:

public static string CreateSection(IQueryable<XElement> section) 
{ 
    var bodySection = from b in articleSection.Descendants("body") 
         select b; 

    //Do replacement here. 

    var bodyElements = bodySection.Descendants(); 

    StringBuilder paragraphBuilder = new StringBuilder(); 
    foreach (XElement paragraph in bodyElements) 
    { 
     paragraphBuilder.Append(paragraph.ToString()); 
    } 

    return paragraphBuilder.ToString(); 
} 

Ce que je veux accomplir est de remplacer le <pullquote> par un <p> (et peut-être ajouter des attributs).

Mon problème n'est pas le remplacement réel (XElement.ReplaceWith()), mais le fait qu'après le remplacement, les modifications ne reflètent pas la variable bodySection qui est utilisée par StringBuilder.

Comment ferais-je pour que cela fonctionne?

Répondre

1

Vous avez pas assez de code vraiment montré - en particulier, vous ne l'avez pas montré le code de remplacement vous êtes en train d'essayer à utiliser.

Cependant, je soupçonne que le problème principal est que bodySection est une requête. Chaque fois que vous l'utiliserez, il interrogera à nouveau section - et si cela tire des informations de la base de données, alors qu'il en soit ainsi. Vous trouverez peut-être que cela est tout ce qu'il faut pour lui faire faire ce que vous voulez:

var bodySection = articleSection.Descendants("body").ToList(); 

De cette façon, vous avez alors obtenu les sections du corps en mémoire, et chaque fois que vous utilisez bodySection vous utiliserez le même collecte d'objets, plutôt que d'interroger à nouveau.

+0

Vous avez raison, en travaillant avec l'ensemble de la collection semble être la seule solution –

+0

@BK: Strictement parlant , il ne doit pas être un 'List ' - tout ce qui matérialise la requête et maintient les résultats fera l'affaire. Le stockage réel est un détail d'implémentation - mais une liste est l'approche la plus simple. –

0

Il sera préférable d'utiliser Xml Tramsformation, regardez here pour savoir comment faire, et here pour la syntaxe xsl

+0

La transformation XML utilisant XSL n'est pas vraiment une option ici, elle irait à l'encontre de tout ce qui a déjà été fait. –

+0

La seule façon que je vois ce travail, est de convertir toute la collection toList() et de travailler à partir de là –