private static string ReadXpathFromFile(ConsoleArguments args, string documentName)
        {
            var doc = new XmlDocument();

            doc.Load(Path.Combine(args.XmlsFolderPath, documentName));

            XmlNode?root = doc.DocumentElement;

            if (root == null)
            {
                throw new WrongDocumentException("The document contains no root element");
            }

            var xmlNamespaceManager = new XmlNamespaceManager(doc.NameTable);

            xmlNamespaceManager.AddNamespace("ns", "http://www.tempuri.org/XML");

            var node = root.SelectSingleNode(args.XpathExpression, xmlNamespaceManager);

            if (node == null)
            {
                throw new WrongDocumentException($"The path: {args.XpathExpression} doesn't exist");
            }

            return(node.InnerXml);
        }
        private static void AddToCsv(ConsoleArguments args, string fileName, string value)
        {
            using var writer    = new StreamWriter(args.OutputFilePath);
            using var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture);
            csvWriter.WriteRecord(new CsvModel {
                FileName = fileName, Value = value
            });
            csvWriter.NextRecord();

            writer.Flush();
        }
        private static void ReadXpath(ConsoleArguments args)
        {
            if (!File.Exists(args.OutputFilePath))
            {
                File.Create(args.OutputFilePath);
            }

            if (!Directory.Exists(args.XmlsFolderPath))
            {
                throw new WarningException("The path to the output folder doesn't exist");
            }

            var listOfActions  = new List <Action>();
            var documentsNames = Directory.GetFiles(args.XmlsFolderPath);

            if (documentsNames.Any(documentName => Path.GetExtension(documentName) != ".xml"))
            {
                throw new WrongPathException("The path contains a file without XML extension");
            }

            using (var writer = new StreamWriter(args.OutputFilePath))
            {
                using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture))
                {
                    csvWriter.WriteHeader(typeof(CsvModel));
                    csvWriter.NextRecord();
                    writer.Flush();
                }
            }
            foreach (var documentName in documentsNames)
            {
                listOfActions.Add(() =>
                {
                    var result = ReadXpathFromFile(args, documentName);

                    AddToCsv(args, Path.GetFileName(documentName), result);
                });
            }

            var options = new ParallelOptions {
                MaxDegreeOfParallelism = args.NumberOfThreads
            };

            Parallel.Invoke(options, listOfActions.ToArray());
        }