0

次のxmlドキュメントについて考えてみましょう。

<contact>
    <name>Hines</name>
    <phone>206-555-0144</phone>
    <mobile>425-555-0145</mobile>
</contact>

そこから値を取得します

var value = parent.Element("name").Value;

上記のコードはNullReferenceException、「名前」が存在しない場合にaをスローします。これは、ElementがC#ではnullを返すが、空の値をスローするvb.netでは返さないためです。

したがって、私の問題は、ルートノードの下のxmlノードが欠落していることを特定し、代わりに空の値を取得することです。

4

3 に答える 3

6

簡単に再利用できる拡張メソッドを作成できます。静的クラスに配置します

public static string ElementValue(this XElement parent, string elementName)
{
    var xel = parent.Element(elementName);
    return xel == null ? "" : xel.Value;
}

今、あなたはそれをこのように呼ぶことができます

string result = parent.ElementValue("name");

アップデート

要素が存在しないときに空の文字列の代わりに戻るnullと、空の要素と要素がないことを区別できるようになります。

public static string ElementValue(this XElement parent, string elementName)
{
    var xel = parent.Element(elementName);
    return xel == null ? null : xel.Value;
}

 

string result = parent.ElementValue("name");
if (result == null) {
    Console.WriteLine("Element 'name' is missing!");
} else {
    Console.WriteLine("Name = {0}", result);
}

編集

Microsoftは、.NETFrameworkクラスライブラリのさまざまな場所で次のパターンを使用しています

public static bool TryGetValue(this XElement parent, string elementName,
                                                     out string value)
{
    var xel = parent.Element(elementName);
    if (xel == null) {
        value = null;
        return false;
    }
    value = xel.Value;
    return true;
}

このように呼ぶことができます

string result;
if (parent.TryGetValue("name", out result)) {
    Console.WriteLine("Name = {0}", result);
}

アップデート

C#6.0(Visual Studio 2015)で、Microsoftはヌル伝播演算子を導入して?.物事を大幅に簡素化しました。

var value = parent.Element("name")?.Value;

これにより、要素が見つからなかった場合でも、値がnullに設定されます。

??次以外の値を返したい場合は、合体演算子と組み合わせることもできますnull

var value = parent.Element("name")?.Value ?? "";
于 2012-11-14T12:52:03.293 に答える
4

要素をnull許容型にキャストするだけです。XElementには、オーバーロードされた明示的なキャスト演算子が多数あり、要素の値を必要な型にキャストします。

string value = (string)parent.Element("name");

この場合、要素<name>が見つからない場合は、値が。に等しい文字列を取得しますnullNullReferenceExceptionは発生しません

null要素がxmlに存在しない場合、その要素に適切な値はそれだけだと思います。しかし、代わりに本当に空の文字列が必要な場合は、次のようにします。

string value = (string)parent.Element("name") ?? "";
于 2012-11-14T12:52:58.860 に答える
0
var value = parent.Element("name") != null ? parent.Element("name").Value : ""
于 2012-11-14T12:46:09.263 に答える