4

以下の XML に似たものがあります。C# で Linq を使用して解析していますtype

<productList>
    <product>
        <type>
            <colour>red</colour>
        </type>
        <name>First</name>
    </product>
    <product>
        <name>Second</name>
    </product>
</productList>

colourの下の要素にアクセスしようとしていますtypeが、コードが要素productを持たないに到達するとtype、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。

現時点でアクセスするために使用しているコードは次のとおりです。私がこれを解決しようとした試みで、事態は少し複雑になりました。

productColour = products.Element("type").Descendants().FirstOrDefault() == null ? string.Empty : products.Element("type").Descendants().FirstOrDefault().Value,

colour要素は常に の下にあることがわかっているtypeので、 を使用できます.FirstOrDefault()が、このコードを使用しても同じエラーが発生します。

誰かが私を正しい方向に向けることができますか? また、文字列へのキャストも試みましたが?? " "、最後に、これまでのところすべて役に立ちませんでした。

編集: @ anthony-pegram のおかげで、親要素が存在しない場合でも、常に子孫を取得しようとしていることが問題のようです。したがって、子を取得する前に親要素を確認する必要があるようです-誰かが私にこれの方向を教えてもらえますか?

4

3 に答える 3

3

Elements()はIEnumerableを返します。要素が存在しない場合、IEnumerableは空になり、要素を再度呼び出してもnull参照例外は発生しません。以下のコードは、null参照例外をスローせずに、product\type要素の下から色をプルする必要があります。色またはタイプが存在しない場合は、nullを返します。

(string)product.Elements("type").Elements("colour").FirstOrDefault()
于 2012-11-19T16:26:09.547 に答える
0

代わりに属性を使用することを考えましたか?

<productList>
    <product type="color-red">
        <name>First</name>
    </product>
    <product type="none">
        <name>Second</name>
    </product>
</productList>

type属性はデフォルトの文字列値を持つことができるため、null変数を返す可能性はありません。また、これはもっときちんとしていると思いますが、それは個人的な好みです。

あなたもすることができます<product color="red" />など。

于 2012-11-19T16:36:35.520 に答える
0

ここでは XPath を使用します

var xDoc = XDocument.Parse(xml);
var colour = xDoc.XPathSelectElement("//product/type/colour");
if(colour!=null)
{
    var val = colour.Value;
}
于 2012-11-19T16:20:53.080 に答える