none
Agrupar itens xml RRS feed

  • Pergunta

  • Bom dia pessoal,

    Estou de novo com o seguinte problema, meu cliente tem um xml com a seguinte estrutura:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <produtos>
      <product>
        <idProduto>5</idProduto>
        <name><![CDATA[Produto 1]]></name>
        <idSku>2000029</idSku>
        <categoryid1><![CDATA[Mega]]></categoryid1>
        <SKU><![CDATA[040600620000980]]></SKU>
      </product>
      <product>
        <idProduto>5</idProduto>
        <name><![CDATA[Produto 1]]></name>
        <idSku>2000030</idSku>
        <categoryid1><![CDATA[Mega]]></categoryid1>
        <SKU><![CDATA[040600620000985]]></SKU>
      </product>
      <product>
        <idProduto>5</idProduto>
        <name><![CDATA[Produto 1]]></name>
        <idSku>2000031</idSku>
        <categoryid1><![CDATA[Mega]]></categoryid1>
        <SKU><![CDATA[040600620000990]]></SKU>
      </product>
      <product>
        <idProduto>5</idProduto>
        <name><![CDATA[Produto 1]]></name>
        <idSku>2000032</idSku>
        <categoryid1><![CDATA[Mega]]></categoryid1>
        <SKU><![CDATA[040600620000995]]></SKU>
      </product>
      <product>
        <idProduto>13</idProduto>
        <name><![CDATA[Produto 2]]></name>
        <idSku>2000197</idSku>
        <categoryid1><![CDATA[Bazar]]></categoryid1>
        <SKU><![CDATA[171011710000136]]></SKU>
      </product>
      <product>
        <idProduto>13</idProduto>
        <name><![CDATA[Produto 2]]></name>
        <idSku>2000199</idSku>
        <categoryid1><![CDATA[Bazar]]></categoryid1>
        <SKU><![CDATA[171011710000138]]></SKU>
      </product>

      ...
    </produtos>

    e eu preciso transformar nisso:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <produtos>
      <product>
        <idProduto>5</idProduto>
        <name><![CDATA[Produto 2]]></name>
        <idSku>2000029|2000030|2000031|2000032</idSku>
        <categoryid1><![CDATA[Mega]]></categoryid1>
        <SKU><![CDATA[040600620000980|040600620000985|040600620000990|040600620000995]]></SKU>
      </product>
      <product>
        <idProduto>13</idProduto>
        <name><![CDATA[Produto 2]]></name>
        <idSku>2000197|2000199</idSku>
        <categoryid1><![CDATA[Bazar]]></categoryid1>
        <SKU><![CDATA[171011710000136|171011710000138]]></SKU>
      </product>
      ...
    </produtos>

    Atualmente estou usando o XDocument para carregar e ler o arquivo, procurei pela internet e achei algumas coisas que poderiam me ajudar, mas não consegui nada, será que alguém sabe ou tem um ideia de como fazer isso??

    Qualquer e toda ajuda será bem vinda, agradeço desde já.

    quarta-feira, 6 de fevereiro de 2013 13:29

Respostas

  • Não tava fazendo nada... então fiz pra vc...

    não sei como fazer isso com um comando... mas nada que um monte não resolva.

                System.Data.DataSet ds = new DataSet();
                ds.ReadXml(System.IO.Directory.GetCurrentDirectory() + "\\x.xml");
    
                System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument(); 
                xDoc.Load(System.IO.Directory.GetCurrentDirectory() + "\\x.xml");
    
                var xDocAgrupado = new System.Xml.XmlDocument(); 
                var xDocAgrupadoProdutos = xDocAgrupado.CreateElement("produtos");
    
                xDocAgrupado.AppendChild(xDocAgrupadoProdutos); 
    
                
                foreach(System.Xml.XmlNode x in xDoc.DocumentElement.ChildNodes )
                {
    
    
                    var xDocAgrupadoProduto = xDocAgrupadoProdutos.SelectSingleNode("product[idProduto = " + 
                        x.SelectSingleNode("idProduto").InnerText + "]");
    
                    
    
                    if (xDocAgrupadoProduto == null)
                    {
                        xDocAgrupadoProduto = xDocAgrupado.CreateElement("product"); 
                        xDocAgrupadoProduto.InnerXml = x.InnerXml;
                        xDocAgrupadoProdutos.AppendChild(xDocAgrupadoProduto);
                        
                    }
                    else
                    {
                        var xIdSku = xDocAgrupadoProduto.SelectSingleNode("idSku");
                        xIdSku.InnerText += "|" + x.SelectSingleNode("idSku").InnerText; 
    
                        var xSku = xDocAgrupadoProduto.SelectSingleNode("SKU");
                        xSku.InnerText += "|" + x.SelectSingleNode("SKU").InnerText;
                        
                    }
                }
    
                string caminhoTemp = System.IO.Path.GetTempFileName();
                caminhoTemp = System.IO.Path.ChangeExtension(caminhoTemp, ".xml");
                System.IO.File.WriteAllText(caminhoTemp, xDocAgrupado.InnerXml);
    
                System.Diagnostics.Process.Start("iexplore", caminhoTemp); 

    • Marcado como Resposta Marcos.Leandro quarta-feira, 13 de março de 2013 15:00
    quarta-feira, 6 de fevereiro de 2013 18:13