2009-01-29 8 views
1

J'ai un objet XmlDocument en mémoire, voici un échantillon des données:Mise à jour XmlDocument LINQ (peut-être)

<terms> 
<letter name="F"> 
<term> 
    <name>fascículo</name> 
    <translation language="en">fascicle</translation> 
    <definition>pequeño paquete de fibras nerviosas o musculares</definition> 
</term> 

(Il y a beaucoup de termes dans le document lui-même)

Je veux être en mesure de trouver un terme par son nœud de nom, puis ajoutez un élément comme un enfant du terme

<terms> 
<letter name="F"> 
<term> 
    <name>fascículo</name> 
    <translation language="en">fascicle</translation> 
    <definition>pequeño paquete de fibras nerviosas o musculares</definition> 
<image>hi there</image> 
</term> 

maintenant, je peux y parvenir en utilisant Xpath, trouver le nœud, puis créer un nouveau noeud avec les nouvelles valeurs , bla bla h.

Mais cela semble un peu long dans le monde de linq.

C'est ce que j'ai jusqu'à présent:

 private static XmlDocument AddImages(XmlDocument termDoc) 
    { 
     XDocument xDoc = XDocument.Load(new XmlNodeReader(termDoc)); 

     using (CsvReader csv = new CsvReader(new StreamReader("spa2engimages.csv"), false)) 
     { 
      csv.ReadNextRecord(); 
      csv.ReadNextRecord(); 
      XElement selectedTerm; 

      string name, imageref; 

      while (csv.ReadNextRecord()) 
      { 
       imageref = csv[0].ToString(); 
       name = csv[3].ToString(); 
       selectedTerm = xDoc.Descendants("term").Single(t => t.Descendants("name").Single().Value == name); 

       //now want to add a new node and save it back in to the termDoc somehow 
      } 
     } 

     return termDoc; 
    } 

Mais je suis un peu perdu de là. Des idées?

Répondre

2

Ce qui suit ajoutera l'élément pour vous

xDoc.Descendants("term").Single(t => t.Descendants("name").Single().Value == name).Add(new XElement("image", "hi there"));

Le plus gros problème que je vois qui est ce qui en fait est le fait maladroits dont vous avez besoin pour passer arrière et en avant entre XmlDocument et XDocument. Ma recommandation est si vous allez utiliser XmlDocument puis utilisez XPath et si vous voulez utiliser LINQ, utilisez XDocument. Cette commutation constante va tuer les performances et la maintenabilité.

+0

Oui, je voulais juste essayer de LINQ et voir s'il était plus facile, peut-être que je devrais rester avec XPath – qui

1

Voici comment le faire avec XPath, juste pour la clarté

termDoc.SelectSingleNode("//term[name='" + name + "']").AppendChild(imageNode);