Если вы просто хотите избежать исключения, вы можете использовать нулевые операторы C #, чтобы проверить, является ли значение null
встроенным, и при необходимости присвоить значение по умолчанию.
Ваш код должен выглядеть следующим образом:
List<PaymentModel> paymentDetails = xml.Descendants("CustomerPayment")
.Select(x => new PaymentModel
{
PaymentRecordNumber = x.Element("InvoiceId")?.Value.ToString() ?? String.Empty,
PaymentMade = Convert.ToDecimal(x.Element("PaymentMade")?.Value ?? "0"),
PaymentDate = !string.IsNullOrEmpty(x.Element("PaymentDate")?.Value.ToString() ?? String.Empty) ? Convert.ToDateTime(x.Element("PaymentDate")?.Value): DateTime.MinValue,
InvoiceCollection = x.Elements("CustomerInvoices")?
.Where(
i => (bool)i.Element("InvoiceId")?.Value.Contains("USA")
|| (bool)i.Element("InvoiceId")?.Value.Contains("JAPAN")
|| (bool)i.Element("InvoiceId")?.Value.Contains("UK")
|| (bool)i.Element("InvoiceId")?.Value.Contains("DENMARK")
)
.Select(i => new InvoiceModel()
{
InvoiceNumber = i.Element("InvoiceNumber")?.Value.ToString() ?? String.Empty,
InvoiceAmount = Convert.ToDecimal(i.Element("AmountPaid")?.Value ?? "0")
}).ToList<InvoiceModel>()
}).ToList<PaymentModel>();
Если вы хотите найти ошибки в XML, вы можете разбить файл, чтобы сузить часть, которая вызывает исключение, или закомментировать строку запроса, чтобы найти хотя бы имя элемента.
Другим способом было бы проверить, является ли документ действительным, проверяя его с помощью XSD , который описывает структуру XML.Это может помочь найти место, где нет элемента или атрибута или где существуют нежелательные элементы и атрибуты.Вы можете написать XSD вручную или даже сгенерировать его из классов C # .