C # Чтение и синтаксический анализ всех XML-файлов в каталоге и записи в файл CSV Signle - PullRequest
0 голосов
/ 27 февраля 2019

У меня такая же структура для многих XML-файлов в каталоге.

Я хочу написать один CSV-файл с необходимыми элементами.

Я совершенно новичок в этом мире, можете ли вы мне помочь, пожалуйста?мне нужен рекурсивный метод?
мне нужно прочитать, а не все

<DatiBeniServizi> // Descendants
        <DettaglioLinee>
            <NumeroLinea>1</NumeroLinea>
            <CodiceArticolo>
                <CodiceTipo>AswArtFor</CodiceTipo> // <- i dont need this
                <CodiceValore>312</CodiceValore> // <- i need only this
            </CodiceArticolo>
            <Descrizione>DELL LATITUDE E6440  CORE I5 4300 2.7 GHZ  8 GB RAM HD 320 DVD WIN 10 PRO GARANZIA 6 MESI</Descrizione>
            <Quantita>5.00000000</Quantita>
            <UnitaMisura>NR</UnitaMisura>
            <PrezzoUnitario>180.00000000</PrezzoUnitario>
            <PrezzoTotale>900.00000000</PrezzoTotale>
            <AliquotaIVA>0.00</AliquotaIVA>
            <Natura>N6</Natura>
        </DettaglioLinee>
        <DettaglioLinee>
            <NumeroLinea>2</NumeroLinea>
            <CodiceArticolo>
                <CodiceTipo>AswArtFor</CodiceTipo> // <- i dont need this
                <CodiceValore>499</CodiceValore> // <- i need only this
            </CodiceArticolo>
            <Descrizione>DELL OPTIPLEX 7010 TOWER i7-3770 3.40 GHz HD 250 GB RAM 4 GB GARANZIA  6 MESI</Descrizione>
            <Quantita>3.00000000</Quantita>
            <UnitaMisura>NR</UnitaMisura>
            <PrezzoUnitario>160.00000000</PrezzoUnitario>
            <PrezzoTotale>480.00000000</PrezzoTotale>
            <AliquotaIVA>22.00</AliquotaIVA>
        </DettaglioLinee>

Я использую этот код, но я не могу прочитать дочерний

        var results = xDocument.Descendants("DatiBeniServizi").Select(x => new {
         Codice = (string)x.Element("CodiceValore"), 
         Descrizione = (string)x.Element("Descrizione"),
         Quantita = (string)x.Element("Quantita"),
         PrezzoUnitario = (string)x.Element("PrezzoUnitario"),
         AliquotaIVA = (string)x.Element("AliquotaIVA")
     }).ToList();

     for (int i = 0; i < results.Count; i++)
     {
         string tempCodice = results[i].Codice;
         string tempDescrizione = results[i].Descrizione;
         string tempQuantita =results[i].Quantita;
         string tempprezzoUnitario = results[i].PrezzoUnitario;
         string tempAliquotaIVA = results[i].AliquotaIVA;

         dataToBeWritten.Append(tempCodice);
         dataToBeWritten.Append(";");
         dataToBeWritten.Append(tempDescrizione);
         dataToBeWritten.Append(";");
         dataToBeWritten.Append(tempQuantita);
         dataToBeWritten.Append(";");
         dataToBeWritten.Append(tempprezzoUnitario);
         dataToBeWritten.Append(";");
         dataToBeWritten.Append(tempAliquotaIVA);
         dataToBeWritten.Append(";");
         dataToBeWritten.Append(0);
         dataToBeWritten.Append(";");
         dataToBeWritten.Append(0);
         dataToBeWritten.Append(Environment.NewLine);
     }


     Console.WriteLine(dataToBeWritten.ToString());
     Console.ReadLine();

     var testpath = AppDomain.CurrentDomain.BaseDirectory + @"\test.csv";

     File.WriteAllText(testpath, dataToBeWritten.ToString());

"Codice = (строка) x.Element ("CodiceValore"), "// <- я не могу прочитать это, я могу только читать </p>

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы можете использовать методы из System.Xml.XPath.Extensions для этого.

Например, если вы хотите выбрать один элемент, вы должны использовать XPathSelectElement ():

var element = xDocument.XPathSelectElement("/DatiBeniServizi/DettaglioLinee/CodiceArticolo/CodiceValore");

или используя ваш подход - вам нужно установить полный путь

var results = xDocument.Descendants("DatiBeniServizi").Select(x => new {
    Codice = (string)x.Elements("DettaglioLinee").Elements("CodiceArticolo").Elements("CodiceValore").FirstOrDefault()?.Value,
    Descrizione = (string)x.Elements("DettaglioLinee").Elements("Descrizione").FirstOrDefault()?.Value,
    Quantita = (string)x.Elements("DettaglioLinee").Elements("Quantita").FirstOrDefault()?.Value,
    PrezzoUnitario = (string)x.Elements("DettaglioLinee").Elements("PrezzoUnitario").FirstOrDefault()?.Value,
    AliquotaIVA = (string)x.Elements("DettaglioLinee").Elements("AliquotaIVA").FirstOrDefault()?.Value
}).ToList();
0 голосов
/ 27 февраля 2019

Это еще один подход, но я не знаю, как использовать, я знаю, это смешно ..

public class Articolo
    {
        public varID codici { get; set; }
        public string varDescrizione { get; set; }
        public string varPrezzoUnitario { get; set; }
        public int varQuantita { get; set; }
        public string varAliquotaIVA { get; set; }

    }

    public class varID
    {
        public List<codicearticolo>  codice = new List<codicearticolo>();

    }

    public class codicearticolo
    {
        public string varcodicetipo { get; set; }
        public string varcodicevalore { get; set; }
    }

    private List<Articolo> GetArticoloList()
    {
        //This method converts an xml file into a .csv file

        XDocument xDocument = XDocument.Load(@"c:\ft\test.xml");
        StringBuilder dataToBeWritten = new StringBuilder();

        var results = from x in xDocument.Descendants("DatiBeniServizi")
                      select new Articolo
                      {
                          codici = new varID()
                          {
                              codice = new List<codicearticolo>(from code in x.Descendants("CodiceArticolo")
                                                                    select new codicearticolo
                                                                    {
                                                                        varcodicetipo = code.Element("CodiceTipo").Value,
                                                                        varcodicevalore = code.Element("CodiceValore").Value

                                                                    })
                          },
                          varDescrizione = x.Element("Descrizione").Value,
                          varPrezzoUnitario = x.Element("PrezzoUnitario").Value,
                         varQuantita  = Convert.ToInt32(x.Element("Quantita").Value),
                          varAliquotaIVA = x.Element("AliquotaIVA").Value


                      };

            return results.ToList();

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...