【问题标题】:How to modify a specific XElement into a file.xml如何将特定的 XElement 修改为 file.xml
【发布时间】:2019-10-02 08:01:06
【问题描述】:

我正在使用 xml 和 c# wpf,我想搜索一个简单的文件 xml 并在每次找到它时修改一个特定的 XElement。而不是包含在该行中的内容,我想将我写的任何内容放入文本框中,实际代码就是这个,现在我只管理如何修改单个特定元素

private void Button_Click(object sender, RoutedEventArgs e)
    {
        string xmlFilePath = @"C:\Users\codroipomad\Desktop\slave\Test.xml";
        XDocument xdoc = XDocument.Load(xmlFilePath);
        XNamespace ns = "http://www.fruitauthority.fake";

        var elBanana = xdoc.Descendants()?.Elements(ns + "FruitName")?.Where(x => x.Value == "Banana")?.Ancestors(ns + "Fruit");

        var elColor = elBanana.Elements(ns + "FruitColor").FirstOrDefault();

        //check se il file esiste,se non esiste lo crea
        if (!File.Exists(xmlFilePath))
        {
            File.Create(xmlFilePath).Dispose();

            if (elColor != null)
            {
                elColor.Value = box.Text;
            }
        }
        //se il file esiste setta il colore con valore pari al valore della textbox
        else if (File.Exists(xmlFilePath))
        {
            if (elColor != null)
            {
                elColor.Value = box.Text;
            }
        }

        xdoc.Save(xmlFilePath);
    }

我正在使用的 xml 是这个(我像 sn-p html 一样插入它,因为我发现只有这种方式可以显示给你)

<?xml version="1.0" encoding="utf-8"?>
<FruitBasket xmlns="http://www.fruitauthority.fake">
  <Fruit>
    <FruitName>Banana</FruitName>
    <FruitColor>pinuzzo</FruitColor>
  </Fruit>
  <Fruit>
    <FruitName>Apple</FruitName>
    <FruitColor>Red</FruitColor>
  </Fruit>
  <Fruit>
    <FruitName>Banana</FruitName>
    <FruitColor>feffolo</FruitColor>
  </Fruit>
  <Fruit>
    <FruitName>Apple</FruitName>
    <FruitColor>Red</FruitColor>
  </Fruit>
  <Face>
    <Name>Banana</Name>
    <Eyes>feffolo</Eyes>
  </Face>
  <Face>
    <Name>Apple</Name>
    <Eyes>Red</Eyes>
  </Face>
</FruitBasket>

在这种情况下,我只想修改程序可以找到的所有 FruitColor

【问题讨论】:

    标签: c# xml wpf


    【解决方案1】:

    所以要将所有香蕉的颜色更新为黄色,请使用以下代码:

            string xmlFilePath = @"C:\Users\codroipomad\Desktop\slave\Test.xml";
            XDocument xdoc = XDocument.Load(xmlFilePath);
            XNamespace ns = "http://www.fruitauthority.fake";
    
            var elBanana = xdoc.Descendants()?.Elements(ns + "FruitName")?.Where(x => x.Value == "Banana")?.Ancestors(ns + "Fruit");
    
            foreach (var item in elBanana)
            {
                var elColor = item.Elements(ns + "FruitColor").FirstOrDefault();
    
                //check se il file esiste,se non esiste lo crea
                if (!File.Exists(xmlFilePath))
                    File.Create(xmlFilePath).Dispose();
    
                if (elColor != null)
                {
                    elColor.Value = "YELLOW";
                }
    
            }
    
            xdoc.Save(xmlFilePath);
    

    【讨论】:

    • 你能告诉我为什么吗?为什么问题出在 elBanana.Elements 上?
    • 这段代码:xdoc.Descendants()?.Elements(ns + "FruitName")?.Where(x => x.Value == "Banana")?.Ancestors(ns + "Fruit ");将为您提供 xml 中“香蕉”的所有元素,其中有 2 个,在这种情况下,您必须使用 foreach 迭代并遍历元素并根据需要更新它
    • 好的,直到我们在同一个浪潮中,但是你已经做了一个 mod:into the foreach this {var elColor = elBanana.Elements(ns + "FruitColor").FirstOrDefault() ;} 变成了 {var elColor = item.Elements(ns + "FruitColor").FirstOrDefault();} 唯一的问题是为什么 elBanana 变成了 item,为什么如果我把 elBanana 放在那里它不起作用?
    • 你不能为所有 Banana 的 Color 元素拥有 1 个属性,每个 Fruit 都有自己的 Fruit 颜色,这就是为什么你需要从每个 Fruit 中单独获取所有颜色并相应地更新它们
    • 完美的这样做,我可以考虑到 xDocument 中的所有元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2021-12-11
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多