XML-файл C# удаляет дубликаты и суммирует значения с помощью LINQ
По сути, я удаляю дублированные записи и суммирую их значения, чтобы иметь только одну из каждой записи.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleApplication2 { class Program { //File const string FILE = "ccc.xml"; static void Main(string[] args) { XDocument doc = XDocument.Load(FILE); List <XElement> originalInvoices = doc.Descendants("Invoice").ToList(); var groups = originalInvoices.GroupBy(x => (string)x.Element("Hash")).ToList(); var finalInvoices = groups.Select(x => new { unit = x.Descendants("UnitPrice").Sum(z => (decimal)z), credit = x.Descendants("CreditAmount").Sum(z => (decimal)z), tax = x.Descendants("TaxPayable").Sum(z => (decimal)z), net = x.Descendants("NetTotal").Sum(z => (decimal)z), gross = x.Descendants("GrossTotal").Sum(z => (decimal)z), first = x.First() }).ToList(); foreach (var finalInvoice in finalInvoices) { finalInvoice.first.Element("Line").SetElementValue("UnitPrice", finalInvoice.unit); finalInvoice.first.Element("Line").SetElementValue("CreditAmount", finalInvoice.credit); finalInvoice.first.Element("DocumentTotals").SetElementValue("TaxPayable", finalInvoice.tax); finalInvoice.first.Element("DocumentTotals").SetElementValue("NetTotal", finalInvoice.net); finalInvoice.first.Element("DocumentTotals").SetElementValue("GrossTotal", finalInvoice.gross); } doc.Element("SalesInvoices").ReplaceWith(new XElement("SalesInvoices", finalInvoices.Select(x => x.first))); Console.WriteLine(doc); Console.ReadKey(); } } }
Проблема в том, что мой код взрывается, когда он достигает следующей строки в конце:
`doc.Element("SalesInvoices").ReplaceWith(new XElement("SalesInvoices", finalInvoices.Select(x => x.first)));`
С следующее сообщение об ошибке:
`An unhandled exception of type 'System.NullReferenceException' occurred in ConsoleApplication2.exe`
Я не могу это исправить мой файл вот этот: [В формате XML] &ЛТ;?в XML версия="1.0" кодирование="UTF-8"?&ГТ; &ЛТ;AuditFile префиксом xmlns="урна:ОЭСР:StandardAudit - Pastebin.com[^]
В принципе, код должен удалить
Invoices
повторный Hash
и суммировать значения UnitPrice
, CreditAmount
, TaxPayable
, NetTotal
, и GrossTotal
, где UnitPrice
и Credit
должно быть то же самое, что и NetTotal
.Так что вместо того, чтобы иметь много
Invoices
с тем же самым Hash
, У меня будет только один счет-фактура с этим хэшем, который имеет сумму значений выше.Код уже удаляет дубликаты и суммирует значения, но почему-то я не знаю, как решить эту проблему.
Было бы здорово, если бы кто-то помог мне с решением этой проблемы, и мне также нужно сохранить "отредактированный" файл, чего не происходит, но моя главная проблема-избавиться от этой ошибки.
Что я уже пробовал:
//File const string FILE = "ccc.xml"; static void Main(string[] args) { XDocument doc = XDocument.Load(FILE); List <XElement> originalInvoices = doc.Descendants("Invoice").ToList(); var groups = originalInvoices.GroupBy(x => (string)x.Element("Hash")).ToList(); var finalInvoices = groups.Select(x => new { unit = x.Descendants("UnitPrice").Sum(z => (decimal)z), credit = x.Descendants("CreditAmount").Sum(z => (decimal)z), tax = x.Descendants("TaxPayable").Sum(z => (decimal)z), net = x.Descendants("NetTotal").Sum(z => (decimal)z), gross = x.Descendants("GrossTotal").Sum(z => (decimal)z), first = x.First() }).ToList(); foreach (var finalInvoice in finalInvoices) { finalInvoice.first.Element("Line").SetElementValue("UnitPrice", finalInvoice.unit); finalInvoice.first.Element("Line").SetElementValue("CreditAmount", finalInvoice.credit); finalInvoice.first.Element("DocumentTotals").SetElementValue("TaxPayable", finalInvoice.tax); finalInvoice.first.Element("DocumentTotals").SetElementValue("NetTotal", finalInvoice.net); finalInvoice.first.Element("DocumentTotals").SetElementValue("GrossTotal", finalInvoice.gross); } doc.Element("SalesInvoices").ReplaceWith(new XElement("SalesInvoices", finalInvoices.Select(x => x.first))); Console.WriteLine(doc); Console.ReadKey(); } } }