2016-04-03 108 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(); 
     }