【问题标题】:Modifying XML elements with c#使用 C# 修改 XML 元素
【发布时间】:2016-04-03 15:29:44
【问题描述】:

所以,我在修改我的 XML 文档时遇到了问题。这是我的 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>

所以我需要更新成分元素内部的特定食谱的 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)));
 }

【问题讨论】:

  • 最初创建 DOM 时,使用 ingredients.Select(text =&gt; new XElement("li", text)) 作为 Ingredient 元素的内容。那么,当您想要修改该元素时,为什么不使用完全相同的语法呢?你的问题很不清楚。请提供一个好的minimal reproducible example,它可以可靠地重现您遇到的任何问题,并准确描述该问题是什么:代码现在做什么,您希望它做什么?
  • List 成分 = ele.Element("Ingredient").Elements("li").ToList();成分[0].Value = 1234;

标签: c# xml wpf linq ado.net


【解决方案1】:

只需使用您的行标识符“li”即可通过循环获得所需的内容。

【讨论】:

    【解决方案2】:

    我建议您为 XML 创建一个树形视图,借助树形视图您可以浏览 XML 中存在的元素,选择您想要更新的任何值,更新后序列化树形视图值并将其保存回 XML 文件。

    您可以在这个 sn-p 的帮助下创建树视图!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多