【问题标题】:update xml using linq in c#在 C# 中使用 linq 更新 xml
【发布时间】:2012-09-28 09:38:49
【问题描述】:

我是 .net 初学者。

我正在尝试使用 linq 更新我的 xml file

我被困在它的第一点,即我无法使用 linq 从 xml 文件中获取值。

这些是我在代码中使用的控件:

cbBrandName -- combobox
cbProduct   -- combobox
txtQuantity -- TextBox

我正在尝试以下代码:

XElement doc = XElement.Load(@"..\..\stock.xml");
string quantity = doc.Descendants("quantity")
                  .Select(y => y.Element("quantity").Value.Equals(txtQuantity.Text))
/*red scribbles to 'Element' in 'where'*/ 
                  .Where(x => x.Element("productname").Value.Equals(cbProduct.Text) &&
                  x.Element("brandname").Value.Equals(cbBrandName.Text)).ToString();
MessageBox.Show(quantity.ToString());

在这里,我试图将“数量”值存储在quantity 字符串中,以便稍后可以对其进行操作,然后再次更新到我的 xml 文件。

当我将.select 作为注释时,它没有显示任何错误,但是当我运行它时,它在 MessageBox 中显示一些 system.linq.Enumerable + ..... 而不是文本。

编辑:

当我最后给出.toString() 时。它显示错误 - “对象引用未设置为对象的实例。”当我运行它时。

请帮忙
提前致谢。

【问题讨论】:

  • 错误:错误 1 ​​'bool' 不包含 'Element' 的定义,并且找不到接受类型为 'bool' 的第一个参数的扩展方法 'Element'(您是否缺少 using 指令还是程序集参考?)
  • 只需向我们展示 xml 格式并得到您想要的结果。
  • 我在我的问题中给出了 xml 格式的链接。请检查

标签: c# xml linq c#-4.0 updates


【解决方案1】:
XElement doc = XElement.Load(AppDomain.CurrentDomain.BaseDirectory + "/App_Data/XMLFile.xml");
        string quantity = doc.Descendants("items")
        .Select(y => y.Element("quantity").Value)
        .Where(x => x.Element("productname").Value.Equals(cbProduct.text) && x.Element("brandname").Value.Equals(cbBrandName.text))
        .Single().Element("quantity").Value;

这行得通

更新 XML 值

 doc.Descendants("items")
    .Where(x => x.Element("productname").Value.Equals(cbProduct.Text) && x.Element("brandname").Value.Equals(cbBrandName.Text))
    .Single().Element("quantity").SetValue(quantity);
        doc.Save(AppDomain.CurrentDomain.BaseDirectory + "/App_Data/XMLFile.xml");

【讨论】:

  • 哦,当然。您正在选择布尔。 @Mr_Green 一分钟后查看更新。
  • .Single().Value;如果不是您想要的,请告诉我您要选择的数量
  • 检查你的代码一次..它有一些错误,比如在哪里重复而不是选择。并使用组合框名称而不是标签名称:)
  • 是的,它是硬编码的,您可以用 textBox.Text 等替换这些值
  • 谢谢。你在我编辑的代码中重复了where :)
【解决方案2】:

您需要从集合中获取一个元素,因为linq 返回“过滤”元素的集合(即使它只包含一个元素)。为此,您可以选择:First()FirstOrDefault()Last()LastOrDefault()Single()、SingleOrDefault()`。

First()FirstOrDefault() 的区别在于如果序列不包含任何元素,第一个将抛出ArgumentNullException,第二个将返回集合元素的默认值(null 用于字符串)

在你的例子中:

XElement doc = XElement.Load(@"..\..\stock.xml");
string quantity = doc.Descendants("quantity")
                  .Select(y => y.Element("quantity").Value.Equals(txtQuantity.Text))
/*red scribbles to 'Element' in 'where'*/ 
                  .Where(x => x.Element("productname").Value.Equals(cbProduct.Text) &&
                  x.Element("brandname").Value.Equals(cbBrandName.Text))
                  .First();
MessageBox.Show(quantity.ToString());

【讨论】:

  • @Mr_Green 在Select 之前使用Where
  • @Mr_Green 哦,请原谅我的错误应该是在Select 中你使IEnumerable<bool>。并且 bool 不能隐式转换为字符串。所以在select 中你需要删除Equalst(txtQuantity.Text)。并删除.ToArray
  • 啊,是的。我就是个菜鸟。现在它显示运行时错误“对象引用未设置为对象的实例”。指向where子句。知道为什么吗?
【解决方案3】:

它返回您看到的文本,因为它返回的是元素集合,而不是单个元素。如果你只想要一个元素,你可以尝试使用

YourCollection.FirstOrDefault()

例如方法。

在你的情况下:

XElement doc = XElement.Load(@"..\..\stock.xml");
var quantity = doc.Descendants("quantity")
              .Select(y => y.Element("quantity").Value.Equals(txtQuantity.Text))
/*red scribbles to 'Element' in 'where'*/ 
              .Where(x => x.Element("productname").Value.Equals(cbProduct.Text) &&
              x.Element("brandname").Value.Equals(cbBrandName.Text)).FirstOrDefault();
MessageBox.Show(quantity.ToString());

【讨论】:

  • 我试过了,但它仍然在“where”中显示“Element”的红色涂鸦。
  • 尝试在 select 语句之前使用 where 语句。
  • 它显示红色涂鸦到 firstOrDefault() 与我在评论中显示的相同错误。
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多