2

なぜ私がこれに苦労しているのかわかりませんが、誰かが私を正しい方向に向けてくれることを願っています.

私はこれらの数行のコードを持っています:

var xDoc = new XmlDocument();
xDoc.LoadXml(xelementVar.ToString());

if (xDoc.ChildNodes[0].HasChildNodes)
{
    for (int i = 0; i < xDoc.ChildNodes[0].ChildNodes.Count; i++)
    {
        var sFormatId = xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"].Value;
        // Do some stuff
    }    
// Do some more stuff
}

問題は、xDoc取得しているノードに常にノードがあるとは限らないformatIDため、null 参照例外が発生することですが、99% の確率で完全に正常に動作します。

私の質問 :

formatIDノードを読み取ろうとする前に、ノードが存在するかどうかを確認するにはどうすればよいValueですか?

4

6 に答える 6

3

DefaultIfEmpty()を使用できますか?

例えば

var sFormatId = xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"]
                                  .Value.DefaultIfEmpty("not found").Single();

または、他の人が示唆しているように、属性が null でないことを確認してください。

if (xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"] != null)
于 2013-07-17T16:13:04.703 に答える
1

これを行うためのよりクリーンな方法は次のようになると思います。

var xDoc = new XmlDocument();
xDoc.LoadXml(xelementVar.ToString());

foreach(XmlNode formatId in xDoc.SelectNodes("/*/*/@formatID"))
{
    string formatIdVal = formatId.Value; // guaranteed to be non-null
    // do stuff with formatIdVal
}
于 2013-07-17T17:12:46.073 に答える
1

このように確認できます

 if(null != xDoc.ChildNodes[0].ChildNode[i].Attributes["formatID"])
于 2013-07-17T16:12:37.167 に答える
1

ほとんどの場合、XPath が存在しないために問題が発生します。これは null を返し、InnerText が原因でコードが壊れます。

XPath が存在するかどうかのみを確認でき、存在しない場合は null を返します。

if(XMLDoc.SelectSingleNode("XPath") <> null)
  ErrorCode = XMLDoc.SelectSingleNode("XPath").InnerText
于 2016-03-28T06:55:34.300 に答える