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 + .....メッセージボックスにエラーが表示されます。

編集:

ここに画像の説明を入力

.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

「フィルタリングされた」要素のコレクションを返すため、コレクションから1つの要素を取得する必要がありlinqます(要素が1つしかない場合でも)。これを行うには、、、、、、、SingleOrDefault()`First()を選択します。FirstOrDefault()Last()LastOrDefault()Single()

First()との違いは、シーケンスに要素が含まれていない場合FirstOrDefault()は最初の1つがスローさArgumentNullExceptionれ、2番目のシーケンスはコレクション要素のデフォルト値(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());
于 2012-10-08T06:53:51.133 に答える
1

単一の要素ではなく、要素のコレクションを返すため、表示されるテキストを返します。要素が 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 に答える