2009-01-29 56 views
1

我在存儲器如下的對象,這裏是數據的一個示例:使用LINQ更新的XmlDocument(可能)

<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> 

(有實際文檔在許多方面)

欲能夠找到它的名字節點項,然後添加一個元素作爲長期

<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> 

現在我可以使用XPath實現這一目標的一個孩子,找到節點,然後創建一個具有新值的新節點,blah bla H。

但這似乎在linq的世界裏有點長。

這是我到目前爲止有:

 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; 
    } 

但我從那裏有點失落。有任何想法嗎?

回答

2

下面將添加的元素對你

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

最大的問題,我看這是使這個笨重的是,你需要切換回來的XmlDocument和的XDocument之間轉發的事實。我的建議是如果你打算使用XmlDocument,然後使用XPath,並且如果你想使用LINQ,那麼使用XDocument。這種不斷的切換會導致性能和可維護性下降。

+0

啊,我只是想嘗試和LINQ,看看它是否是更加容易,也許我應該堅持使用XPath – qui 2009-01-29 15:17:27

1

這是如何使用XPath這樣做,只是爲了清楚起見

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