2016-04-03 146 views
-1

所以,我有一個問題來修改我的XML文檔。這是我的XML用c修改XML元素#

<CookBook> 
    <Recipe id="1"> 
    <Title>Best recipe</Title> 
    <Category>...</Category> 
    <Description>Some text</Description> 
    <Amount>10</Amount> 
    <Ingredient> 
     <li>Ingredient 1</li> 
     <li>Ingredient 2</li> 
    </Ingredient> 
    <RecipeText> 
     <li>Step 1</li> 
     <li>Step 2</li> 
     <li>Step 3</li> 
    </RecipeText> 
    </Recipe> 
    <Recipe id="2"> 
    <Title>Best recipe2</Title> 
    <Category>...</Category> 
    <Description>Some text</Description> 
    <Amount>10</Amount> 
    <Ingredient> 
     <li>Ingredient 1</li> 
     <li>Ingredient 2</li> 
     <li>Ingredient 3</li> 
    </Ingredient> 
    <RecipeText> 
     <li>heat the oven</li> 
     <li>Do something</li> 
     <li>Do something</li> 
    </RecipeText> 
    </Recipe> 
</CookBook> 

所以我需要更新Ingredient元素內部的特定配方的li元素。但我真的不知道如何...我有一個成分列表,其中包含我想要的XML的值。

foreach (var item in lvAddIngredient.Items) 
     { 
      string text = item.ToString(); 
      ingredients.Add(text); 
     } 

當我創建一個新的配方我使用此代碼

var doc = XDocument.Load("recipeXML.xml"); 
      var newElement = new XElement("Recipe", new XAttribute("id", id.ToString()), 
       new XElement("Title", txtTitle.Text), 
       new XElement("Category", selectedCategory.ToString()), 
       new XElement("Description", txtDescription.Text), 
       new XElement("Amount", txtAmount.Text), 
       new XElement("Ingredient", ingredients.Select(text => new XElement("li", text))), 
       new XElement("RecipeText", recipeText.Select(text => new XElement("li", text)))); 
      doc.Element("CookBook").Add(newElement); 
      doc.Save("recipeXML.xml"); 

但我不知道如何更新這些li元素值。我試過這樣的東西,但語法錯了。

var xdoc = XDocument.Load("recipeXML.xml"); 
string id = lbRecipes.SelectedValue.ToString(); 
var items = from item in xdoc.Descendants("Recipe") 
      where item.Attribute("id").Value == id 
      select item; 
foreach (XElement ele in items) 
{ 
    ele.SetElementValue("Title", txtTitle.Text); 
    ele.SetElementValue("Category",cbAddCategory.Text); 
    ele.SetElementValue("Amount", txtAmount.Text); 
    ele.SetElementValue("Description", txtDescription.Text); 
    ele.SetElementValue("Ingredient", ingredients.Select(text => ele.SetElementValue("li", text))); 
} 
+0

當你最初創建的DOM,你使用'ingredients.Select(文=>新的XElement( 「禮」,文本))'的'Ingredient'元素的內容。那麼爲什麼當你想要修改那個元素時你不使用完全相同的語法?你的問題很不清楚。請提供一個很好的[mcve],它可以可靠地再現你遇到的任何問題,並精確描述這個問題是什麼:代碼現在做了什麼,以及你希望它做什麼? –

+0

列表 ingrediants = ele.Element(「Ingredient」)。Elements(「li」)。ToList(); ingrediants [0] .Value = 1234; – jdweng

回答

0

只需使用您的行標識符「li」即可獲得您的循環所需的內容。

0

我建議你爲XML創建一個樹視圖,在樹視圖的幫助下,你可以瀏覽XML中存在的元素,選擇你想要更新的任何值,在更新後序列化樹視圖該值並將其保存回XML文件。

你可以在這段代碼的幫助下創建treeview!

try 
     { 
      treeView1.Nodes.Clear(); 
      treeView1.Nodes.Add(new TreeNode(doc.DocumentElement.Name)); 
      TreeNode tNode = new TreeNode(); 
      tNode = treeView1.Nodes[0]; 
      AddNode(doc.DocumentElement, tNode); 
      treeView1.Show(); 
     } 
     catch (XmlException xmlEx) 
     { 
      MessageBox.Show(xmlEx.Message); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode) 
    { 
     XmlNode xNode; 
     TreeNode tNode; 
     XmlNodeList nodeList; 
     int i; 
     if (inXmlNode.HasChildNodes) 
     { 
      nodeList = inXmlNode.ChildNodes; 
      for (i = 0; i <= nodeList.Count - 1; i++) 
      { 
       xNode = inXmlNode.ChildNodes[i]; 
       inTreeNode.Nodes.Add(new TreeNode(xNode.Name)); 
       tNode = inTreeNode.Nodes[i]; 
       AddNode(xNode, tNode); 
      } 
     } 
     else 
     { 
      inTreeNode.Text = (inXmlNode.InnerText).Trim(); 
     }