1

Linq to Xmlを使用して、レガシーシステムからのいくつかのxmlメッセージを解析しています。メッセージの1つは、名前と値のペアとして届きます。そのため、名前でルックアップを実行してから、同等の値を取得しようとしています。ただし、値が空白(<Value/>)の場合、コードはエラーをスローしますInput string was not in a correct format.

私はこの問題を解決するための最良の方法を見つけようとしています。任意の提案をいただければ幸いです(プロパティをnull許容のint型intで埋めようとしていますか?)。

コード例:

myRecord.myField= xdoc.Descendants("Information")
                        .Where(x => (string)x.Element("Name") == "myField")
                        .Select(x => (int?)x.Element("Value")).FirstOrDefault();

XMLスニペット:

    <Information>
      <Name>myField</Name>
      <Value />
    </Information>

常にフィードバック/入力に感謝します。

ありがとう、

S

4

3 に答える 3

3

要素が空の場合、その値はString.Empty整数として解析できません。したがって、このケースは手動で処理する必要があります。

myRecord.myField = xdoc.Descendants("Information")
                       .Where(x => (string)x.Element("Name") == "myField")
                       .Select(x => x.Element("Value"))
                       .Select(v => (v == null || v.IsEmpty) ? null : (int?)v)
                       .FirstOrDefault();
于 2013-03-12T15:04:32.863 に答える
0

すでに正解はありますが、もう少し説明があればいいと思います。

全体がXElement明示Nullable<T>的な変換を行っています。その例に注意して、何が起こっているのかを確認してください。

XElement element = null;
// returns null
int? value = (int?)element;

element = new XElement("test", 1);
// returns 1
value = (int?)element;

element = new XElement("test");
// throws FormatException
value = (int?)element;

(int?)xElementInstanceのみを返します。nullここで、要素はnullです。それ以外の場合は、int解析が処理され、XElement.Value整数でない場合は常に例外がスローされます(outの場合のように、がない場合Valueのように、のようになりint.Parse(String.Empty)ます)。

変換する前に確認する必要がis XElement setあります。does XElement has value

if (element == null)
    return null;
else if (element.IsEmpty)
    return null
else if (string.IsNullOrEmpty(element.Value))
    return null
else
    return (int?)element;

インラインステートメントを使用して簡単に実行できること:

(element == null || element.IsEmpty || string.IsNullOrEmpty(element.Value) ? null : (int?)element)

要約すると、次のコードは必要なことを実行します-int?要素に値がない場合のイベントであるXElementから取得します。

element = new XElement("test");
// returns null
value = element == null || element.IsEmpty || string.IsNullOrEmpty(element.Value) ? null : (int?)element;
于 2013-03-12T15:05:10.170 に答える
0

これは機能するはずです:

public static class Extensions
{
   public static int? ToInt32(this XElement element)
   {
      if (element == null) return null;
      if (element.IsEmpty) return null;

      // If the element is declared as <Value></Value>,
      // IsEmpty will be false, but the value will be an empty string:
      if (string.IsNullOrEmpty(element.Value)) return null;

      return XmlConvert.ToInt32(element.Value);
   }
}

myRecord.myField = doc.Descendants("Information")
   .Where(x => (string)x.Element("Name") == "myField")
   .Select(x => x.Element("Value").ToInt32()).FirstOrDefault();
于 2013-03-12T15:18:01.167 に答える