2009-06-03 7 views
0

j'ai Xml qui ressemble à ceci:éléments de mise à jour dans Nested Xml

<DataMapper xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SqlTable /> 
    <Level_01s> 
    <DataParameter> 
     <SqlTable>MY-Table-Name</SqlTable> 
     <Children> 
     <DataParameter> 
      <SqlTable>MY-Table-Name</SqlTable> 
      <Children> 
      <DataParameter> 
       <SqlTable>MY-Table-Name</SqlTable> 
       <Children> 
       <DataParameter> 
        <SqlTable>[All]</SqlTable> 
        <Children /> 
       </DataParameter> 
       <DataParameter> 
        <SqlTable>MY-Table-Name</SqlTable> 
        <Children> 
        <DataParameter> 
         <SqlTable>[All]</SqlTable> 
         <Children /> 
        </DataParameter> 
        </Children> 
       </DataParameter> 
       </Children> 
      </DataParameter> 
      </Children> 
     </DataParameter> 
     </Children> 
    </DataParameter> 
    </Level_01s> 
</ DataMapper> 

Ce que je voudrais faire est mise à jour toutes les instances de l'élément. Le problème que j'ai, c'est que les DataParameters peuvent aller profond de n niveaux.

Comment puis-je m'assurer de façon récurrente de mettre à jour tout cela?

J'utilise ce code pour mettre à jour des éléments de niveau racine.

XDocument xdoc = XDocument.Parse(myxmlstring); 
var element = xdoc.Elements("SqlTable").Single(); 
element.Value = "foo";   
xdoc.Save("file.xml"); 

via Best way to change the value of an element in C#

+0

J'ai mis à jour ma réponse pour montrer comment vous pouvez fournir un prédicat dans l'instruction. –

Répondre

3

Si vous utilisez Descendants ("SQLTable") au lieu des éléments ("SQLTable") unique() il vous obtiendra tous les éléments "SQLTable" dans le document entier. Ensuite, vous pouvez juste foreach à travers eux et mettre à jour les éléments.

var elements = xdoc.Descendants("SqlTable"); 

foreach (var sqlTable in elements) 
{ 
    sqlTable.Value = "foo"; 
} 

Ou si vous voulez être concis, vous pouvez tout faire dans la syntaxe LINQ

Mise à jour sur la base commentaire, Ajouté .Lorsque avec prédicat pour construire la liste comme un exemple d'utilisation d'une condition.

xdoc.Descendants("SqlTable").Where(s => s.Value != "All").ToList().ForEach(p => p.Value = "foo"); 
+0

Comment pourrais-je utiliser la syntaxe LINQ mais fournir une conditionnelle? (p => p.Value = "foo") seulement si p.Valeur! = "Tout"? – Nate

+0

Je devais changer .All (s => s.Value! = "All") à .Where (s => s.Value! = "All") mais cela a bien fonctionné! Merci! – Nate