Внутри этого блока if
...
if (xdoc.Root.Descendants("HOST").Descendants("Default").Any())
{
if (xdoc.Root.Descendants("HOST").Descendants("Default").FirstOrDefault().Descendants("HostID").FirstOrDefault().Descendants("Deployment").Any())
{
if (xdoc.Root.Descendants("HOST").Descendants("Default").FirstOrDefault().Descendants("HostID").Any())
{
var hopsTempplateDeployment = xdoc.Root.Descendants("HOST").Descendants("Default").FirstOrDefault().Descendants("HostID").FirstOrDefault().Descendants("Deployment").FirstOrDefault();
deploymentKind = hopsTempplateDeployment.Attribute("DeploymentKind");
host = hopsTempplateDeployment.Attribute("HostName");
}
}
}
... вы установили, что элемент <Root>/HOST/Default
существует. Однако вы не знаете, существует ли <Root>/HOST/Default/HostId/Deployment
. Если этого не произойдет, вы получите NullReferenceException
как тот, который вы испытываете из-за использования FirstOrDefault
. Как правило, рекомендуется использовать First
в тех случаях, когда вы ожидаете, что элементы будут присутствовать, что даст вам как минимум лучшее сообщение об ошибке.
Если вы ожидаете, что элементы не будут присутствовать, простое решениеиспользовать ?.
вдоль соответствующей оси LINQ2XML:
var hopsTemplateDeployment =
xdoc.Root.Descendants("HOST").Descendants("Default").FirstOrDefault()
?.Descendants("HostID").FirstOrDefault()
?.Descendants("Deployment").FirstOrDefault();
if (hopsTemplateDeployment != null)
{
deploymentKind = hopsTemplateDeployment.Attribute("DeploymentKind");
host = hopsTemplateDeployment.Attribute("HostName");
}
Это также спасет вас от цепочки вложенных предложений if
.