4

私が直面している状況は、Linq を使用して XML ドキュメントをオブジェクトに解析することです。解析中に、値の解析に進む前に、要素が null でないことを確認しています。このステートメントを単純化する方法はありますか?

  var variable = (from x in xdoc.Descendants("Root")
                 select new AccountingResponse
                 {      
                 NetCharge = x.Element("Charges") != null && x.Element("Charges").Element("NetCharge") != null ? x.Element("Charges").Element("NetCharge").Value : "0",
                 TotalCharge = x.Element("Charges") != null && x.Element("Charges").Element("TotalCharge") != null ? x.Element("Charges").Element("TotalCharge").Value : "0"
                 }).SingleOrDefault();

要約すると、各行にノードが存在するかどうかを引き続き確認する必要はありません。解析の前​​にノードが存在するかどうかをテストできることはわかっていますが、AccountingResponse を作成するために解析する必要がある他のデータがある可能性があるため、一度に XML の一部のみを解析する if ステートメントは避けたいと考えています。

あるいは、私はこれを完全に間違ってやっているのかもしれません。もっと良い方法があります!

4

3 に答える 3

7

簡単なオプションの 1 つは、要素が存在しない場合に長さ 0 のシーケンスを返す代わりに -Elementsを使用することです。Elementしたがって、次を使用できます。

from x in xdoc.Descendants("Root")
select new AccountingResponse
{      
    NetCharge = x.Elements("Charges")
                 .Elements("NetCharge")
                 .Select(y => (int) y)
                 .FirstOrDefault(),
    TotalCharge = x.Elements("Charges")
                   .Elements("TotalCharge")
                   .Select(y => (int) y)
                   .FirstOrDefault(),
}).SingleOrDefault();

(元のコードはコンパイルされないことに注意してください。Value文字列は0ですが、intです...)

于 2013-04-05T15:33:11.650 に答える
3

C# 6.0 では、モナドの Null 条件演算子を使用でき?. ます。例に適用すると、次のようになります。

var variable = (from x in xdoc.Descendants("Root")
                select new
                {
                    NetCharge = x.Element("Charges")?.Element("NetCharge")?.Value ?? "0",
                    TotalCharge = x.Element("Charges")?.Element("TotalCharge")?.Value ?? "0"
                }).SingleOrDefault();

詳細については、Null 条件演算子というタイトルの部分を参照してください。

于 2015-09-06T09:40:31.923 に答える
2

交換できます

x.Element("nodeName") != null : int.Parse(x.Element("nodeName").Value) : 0

(int)x.Element("nodeName")

stringintdoubledecimalbooluintDateTimeおよびNullableそれらの場合にも機能します。

于 2013-04-05T15:32:52.853 に答える