Read XML file in C #

6

I have a problem when reading an XML file in C #. In this this is a file of a pre-sale, and I have the following situation: in my xml I will have several pre-sales, and each pre-sale may have several items. So far so good, I'm able to identify the amount of pre-sale and its items. However, by adding pre-sale information "1" it brings pre-sale items "1" but also pre-sale items "2".

My XML file is this:

<?xml version="1.0"?>
<fdv>
  <data>28/01/2015 09:25:47</data>
  <valores>
    <orcamento>
      <id>1</id>
      <cliente>
        <id>151</id>
        <codigoImport>000000000000623</codigoImport>
        <uf>PE</uf>
        <bairro>AGAMENOM MAGALHAES</bairro>
        <cep />
        <cidade>CARUARU</cidade>
        <complEnd></complEnd>
        <documento1 />
        <documento2 />
        <email></email>
        <endereco>RODOVIA BR 232 KM 137</endereco>
        <fantasia></fantasia>
        <nome>ALIANÇA DISTRIB GEN ALIMENTICIOS LTDA</nome>
        <num>S/N</num>
        <obs></obs>
        <pessoa>J</pessoa>
        <regiao>
          <id>0</id>
          <codigoImport />
          <nome />
        </regiao>
        <responsavel />
        <telefone>0000000000</telefone>
        <ativo>false</ativo>
      </cliente>
      <condPagto>
        <id>22</id>
        <codigoImport>11</codigoImport>
        <descricao>A VISTA</descricao>
        <porcDesc>0.0</porcDesc>
        <parcelas>0</parcelas>
      </condPagto>
      <data>2015-01-28 11:19:31.0 UTC</data>
      <itens>
        <orcamentoitem>
          <id>1</id>
          <produto>
            <id>2130</id>
            <codigoImport>001531</codigoImport>
            <codBarras>07898924256428</codBarras>
            <descricao>NOVO PRODUTO</descricao>
            <url />
            <grupo>
              <id>1</id>
              <codigoImport>0001</codigoImport>
              <descricao>PADRÃO</descricao>
            </grupo>
            <obs />
            <un>UN</un>
            <precoVenda>10.5</precoVenda>
            <estoque>0.0</estoque>
          </produto>
          <idOrcamento>1</idOrcamento>
          <qtde>3.0</qtde>
          <valor>10.5</valor>
          <valorBruto>10.5</valorBruto>
        </orcamentoitem>
        <orcamentoitem>
          <id>1</id>
          <produto>
            <id>2130</id>
            <codigoImport>001531</codigoImport>
            <codBarras>07898924256428</codBarras>
            <descricao>ARCO DE SERRA SOLIDO</descricao>
            <url />
            <grupo>
              <id>1</id>
              <codigoImport>0001</codigoImport>
              <descricao>PADRÃO</descricao>
            </grupo>
            <obs />
            <un>UN</un>
            <precoVenda>10.5</precoVenda>
            <estoque>0.0</estoque>
          </produto>
          <idOrcamento>1</idOrcamento>
          <qtde>3.0</qtde>
          <valor>10.5</valor>
          <valorBruto>10.5</valorBruto>
        </orcamentoitem>
        <orcamentoitem>
          <id>2</id>
          <produto>
            <id>1917</id>
            <codigoImport>001160</codigoImport>
            <codBarras>00000000001160</codBarras>
            <descricao>ARRUELA 5/32</descricao>
            <url />
            <grupo>
              <id>1</id>
              <codigoImport>0001</codigoImport>
              <descricao>PADRÃO</descricao>
            </grupo>
            <obs />
            <un>UN</un>
            <precoVenda>0.2</precoVenda>
            <estoque>0.0</estoque>
          </produto>
          <idOrcamento>1</idOrcamento>
          <qtde>50.0</qtde>
          <valor>0.2</valor>
          <valorBruto>0.2</valorBruto>
        </orcamentoitem>
        <orcamentoitem>
          <id>3</id>
          <produto>
            <id>2067</id>
            <codigoImport>001405</codigoImport>
            <codBarras>00000000001405</codBarras>
            <descricao>ARMÁRIO PARA BANHEIR</descricao>
            <url />
            <grupo>
              <id>1</id>
              <codigoImport>0001</codigoImport>
              <descricao>PADRÃO</descricao>
            </grupo>
            <obs />
            <un>UN</un>
            <precoVenda>34.7</precoVenda>
            <estoque>0.0</estoque>
          </produto>
          <idOrcamento>1</idOrcamento>
          <qtde>1.0</qtde>
          <valor>34.7</valor>
          <valorBruto>34.7</valorBruto>
        </orcamentoitem>
      </itens>
      <obs />
      <status>1</status>
      <valorTotal>76.2</valorTotal>
    </orcamento>
    <orcamento>
      <id>2</id>
      <cliente>
        <id>154</id>
        <codigoImport>000000000000626</codigoImport>
        <uf>PE</uf>
        <bairro>CENTRO</bairro>
        <cep />
        <cidade>TEREZINHA</cidade>
        <complEnd></complEnd>
        <documento1 />
        <documento2 />
        <email></email>
        <endereco>RUA CORONEL FRANCISCO MARTINS</endereco>
        <fantasia></fantasia>
        <nome>CONSELHO ESCOLAR DA ESCOLA ABILIO ALVES</nome>
        <num>S/N</num>
        <obs></obs>
        <pessoa>J</pessoa>
        <regiao>
          <id>0</id>
          <codigoImport />
          <nome />
        </regiao>
        <responsavel />
        <telefone>8737921116</telefone>
        <ativo>false</ativo>
      </cliente>
      <condPagto>
        <id>13</id>
        <codigoImport>02</codigoImport>
        <descricao>0 + 02</descricao>
        <porcDesc>0.0</porcDesc>
        <parcelas>2</parcelas>
      </condPagto>
      <data>2015-01-28 11:21:29.0 UTC</data>
      <itens>
        <orcamentoitem>
          <id>4</id>
          <produto>
            <id>2346</id>
            <codigoImport>001934</codigoImport>
            <codBarras>00000000001934</codBarras>
            <descricao>BANDEJA PLASTICA 23C</descricao>
            <url />
            <grupo>
              <id>1</id>
              <codigoImport>0001</codigoImport>
              <descricao>PADRÃO</descricao>
            </grupo>
            <obs />
            <un>AM</un>
            <precoVenda>4.0</precoVenda>
            <estoque>0.0</estoque>
          </produto>
          <idOrcamento>2</idOrcamento>
          <qtde>100.0</qtde>
          <valor>4.0</valor>
          <valorBruto>4.0</valorBruto>
        </orcamentoitem>
        <orcamentoitem>
          <id>5</id>
          <produto>
            <id>1647</id>
            <codigoImport>000608</codigoImport>
            <codBarras>00000000000608</codBarras>
            <descricao>BACIA SÁNITARIO LUZA</descricao>
            <url />
            <grupo>
              <id>1</id>
              <codigoImport>0001</codigoImport>
              <descricao>PADRÃO</descricao>
            </grupo>
            <obs />
            <un>UN</un>
            <precoVenda>93.0</precoVenda>
            <estoque>0.0</estoque>
          </produto>
          <idOrcamento>2</idOrcamento>
          <qtde>1.0</qtde>
          <valor>93.0</valor>
          <valorBruto>93.0</valorBruto>
        </orcamentoitem>
        <orcamentoitem>
          <id>6</id>
          <produto>
            <id>2374</id>
            <codigoImport>002023</codigoImport>
            <codBarras>00000000002023</codBarras>
            <descricao>ARGAMASSA TOP</descricao>
            <url />
            <grupo>
              <id>1</id>
              <codigoImport>0001</codigoImport>
              <descricao>PADRÃO</descricao>
            </grupo>
            <obs />
            <un>AM</un>
            <precoVenda>32.0</precoVenda>
            <estoque>0.0</estoque>
          </produto>
          <idOrcamento>2</idOrcamento>
          <qtde>4.0</qtde>
          <valor>32.0</valor>
          <valorBruto>32.0</valorBruto>
        </orcamentoitem>
      </itens>
      <obs />
      <status>1</status>
      <valorTotal>621.0</valorTotal>
    </orcamento>
  </valores>
  <vendedor>V001</vendedor>
</fdv>

My code for reading XML now looks like this:

private void impotPreVenda(string caminho){

    if(File.Exists(caminho)){

        XmlDocument doc = new XmlDocument();

        doc.Load(caminho);                                                          

        XmlNodeList xmlPreVen = doc.GetElementsByTagName("orcamento");
        XmlNodeList xnListItens = doc.GetElementsByTagName("orcamentoitem");

        for (int i = 0; i < xmlPreVen.Count; i++)
        {
            string IdCli = xmlPreVen[i]["cliente"].ChildNodes[1].InnerText;

            for(int y = 0; y < xnListItens.Count; y++){

                string DescPro = xmlPreVen[i]["itens"].ChildNodes[y].ChildNodes[1].ChildNodes[3].InnerText;
            }
        }
    }
}
    
asked by Joaquim Caetano Teixeira 30.01.2015 в 20:39

5 answers

3

You are first picking all <orcamento> tags. Then get all of <orcamentoitem> , regardless of which budget they fit.

If you do this:

XmlNodeList xmlPreVen = doc.GetElementsByTagName("orcamento");

And after your loop, you see from here on:

XmlNodeList xmlListItens = xmlPreVen.[i]["itens"]["orcamentoitem"].ChildNodes;

then xmlListItens ends up being only that budget.

    
31.01.2015 / 19:54
3

Thanks for your help, and I hope you have a good time.

private void importPreVenda(string caminho)
{
    if (File.Exists(caminho))
    {
        XmlDocument doc = new XmlDocument();

        doc.Load(caminho);

        XmlNodeList xmlPreVen = doc.GetElementsByTagName("orcamento");

        for (int i = 0; i < xmlPreVen.Count; i++)
        {
            XmlNodeList xmlListItens = xmlPreVen[i]["itens"].ChildNodes;

            string IdCli = xmlPreVen[i]["cliente"].ChildNodes[1].InnerText;
            string NomCli = xmlPreVen[i]["cliente"].ChildNodes[12].InnerText;
            string data = xmlPreVen[i]["data"].InnerText;

            for (int y = 0; y < xmlListItens.Count; y++)
            {
                string CodBarras = xmlListItens[y]["produto"].ChildNodes[2].InnerText;
                string DescPro = xmlListItens[y]["produto"].ChildNodes[3].InnerText;
                decimal qtd = Decimal.Parse(xmlListItens[y]["qtde"].InnerText.Replace(".", ","));
                decimal VlrUni = Decimal.Parse(xmlListItens[y]["produto"].ChildNodes[8].InnerText.Replace(".", ","));
            }
        }
    }
}   
    
01.02.2015 в 03:37
2

Try this:

 string caminho = @"seu caminho";

        if (File.Exists(caminho))
        {
            StreamReader sr = new StreamReader(caminho);
            XmlDocument doc = new XmlDocument();

            doc.Load(sr);
            XmlNode valores = doc.SelectSingleNode("//valores");


            var orcamentos = valores.SelectNodes("//orcamento");

            for (int i = 0; i < orcamentos.Count; i++)
            {
                //var orcamento = orcamentos[i].SelectSingleNode("//itens");


                string idCli = orcamentos[i]["cliente"].ChildNodes[0].InnerText;

//Este é o truque, você pega os node filhos do item que vc está atualmente.
                var orcamentoItens = orcamentos[i].SelectSingleNode("//itens").ChildNodes;


                for (int j = 0; j < orcamentoItens.Count; j++)
                {
                    string DescPro = orcamentoItens[j].ChildNodes[1].ChildNodes[3].InnerText;
                }
            }
    
31.01.2015 в 19:44
2

1st pre-sale items only

var xdoc = XDocument.Load(@"c://temp//orcamento.xml");


//somente primeiro orçamento
var lv1s = from lv1 in xdoc.Descendants("orcamento")
    where (string) lv1.Element("id").Value == "1"
    select lv1;


//Loop orcamento 1
foreach (var orc in lv1s)
{
    Console.WriteLine("Orçamento {0} Total Orçamento {1}", orc.Element("id").Value, orc.Element("valorTotal").Value);
    foreach (var itens in orc.Descendants("itens"))
    {
        foreach (var orcitem in itens.Descendants("orcamentoitem"))
            Console.WriteLine("Id Orçamento {0} \t Qtde {1} \t Valor {2} \t Valor Bruto {3}",
                orcitem.Element("idOrcamento").Value,
                orcitem.Element("qtde").Value,
                orcitem.Element("valor").Value,
                orcitem.Element("valorBruto").Value);                    
    }

}
Console.ReadKey();

Use imagination to pick products, customers, etc., good luck. ;) @ joaquim-caetano-teixeira Source: link

    
31.01.2015 в 23:43
0

You have to read the items by instantiating the main

XmlNodeList xmlPreVen = doc.GetElementsByTagName("orcamento");
XmlNodeList xnListItens = doc.GetElementsByTagName("orcamentoitem");

are getting independent, then it enters the 1st loop, but when it goes to the 2nd loop the count of it is being of all tags of orcamentoItens...

    
30.01.2015 в 21:14