在通过缺少元素的XML文件进行解析时,避免使用NullReferenceException

时间:2017-10-29 16:28:48

标签: c# xml xml-parsing

从XML文件读取数据时,我遇到NullReferenceException的问题。有时候某些节点不存在,请参阅“Profil”和“Profil' - 我尝试使用??运算符,但这仅在节点存在时才有效。然后我尝试检查节点是否存在

if([["Kante"]["Profil"]["Profilbreite"] != null) 

但是如果例如["Profil"]不存在,则会抛出异常。

我希望不要将try{}catch()用于我需要的每一个值。

XmlDocument XMLDoc = new XmlDocument();
XMLDoc.Load(file);

XmlNodeList NL_Stammdaten = XMLDoc.SelectNodes("//*[local-name()='AbwassertechnischeAnlage']");

for (int i = NL_Stammdaten.Count - 1; i >= 0; i--)
{
    string Objektbezeichnung = "";
    int Profilbreite = 0;

    Objektbezeichnung = NL_Stammdaten[i]["Objektbezeichnung"].InnerText ?? ""; //First attempt with the ?? Operator
    if (NL_Stammdaten[i]["Objektbezeichnung"] != null) Objektbezeichnung = NL_Stammdaten[i]["Objektbezeichnung"].InnerText ?? ""; //Second attempt with ?? Operator and if(null)
    if (NL_Stammdaten[i]["Kante"]["Profil"]["Profilbreite"] != null) Profilbreite = Convert.ToInt32(NL_Stammdaten[i]["Kante"]["Profil"]["Profilbreite"].InnerText ?? ""); //Throws exception if the ["Profil"] -Node dosn't exists in the XML
}

XML文件:

<Data>
    <AbwassertechnischeAnlage>
        <Objektbezeichnung>113062SE04</Objektbezeichnung>
        <Kante>
            <KantenTyp>1</KantenTyp>
            <Profil>
                <Profil>1</Profil>
                <Profilbreite>300</Profilbreite>
            </Profil>
        </Kante>
    </AbwassertechnischeAnlage>
    <AbwassertechnischeAnlage>
        <Objektbezeichnung>113062SE04</Objektbezeichnung>
        <Kante>
            <KantenTyp>1</KantenTyp>
            <!--<Profil></Profil> dosn't exists -->
        </Kante>
    </AbwassertechnischeAnlage>
</Data>

1 个答案:

答案 0 :(得分:1)

使用Null-conditional operator之类的

if (NL_Stammdaten[i]?["Kante"]?["Profil"]?["Profilbreite"] != null)

应该这样做。

  

用于在执行成员访问(?。)或索引(?[)操作之前测试null。这些运算符可以帮助您编写更少的代码来处理空值检查,尤其是降序到数据结构中。

这意味着您可以简单地链接数组访问器而无需编写大量的空值检查。