1

我是.net 初学者。

我正在尝试使用 linq更新我的xml 文件。

我被困在它的第一点,即我无法使用 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发表评论时,它没有显示任何错误,但是当我运行它时,它system.linq.Enumerable + .....在 MessageBox 中显示一些而不是文本。

编辑:

在此处输入图像描述

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

请帮助
提前致谢。

4

3 回答 3

6
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");
于 2012-10-08T06:55:52.860 回答
1

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

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());
于 2012-10-08T06:51:26.437 回答
1

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

First()和之间的区别在于如果序列不包含元素,FirstOrDefault()第一个将抛出,第二个将返回集合元素的默认值(对于字符串)ArgumentNullExceptionnull

在您的示例中:

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());
于 2012-10-08T06:53:51.133 回答