none
Problema ao atualizar arquivo XML RRS feed

  • Pergunta

  • Ola pessoal

    Tenho a seguinte estrutura do xml:

    <q>
      <p>
      <id>1</id>
      <teath_id>1</teath_id>
      <port_quest>texto ...</port_quest>
      <port_a> texto </port_a>
      <port_b>texto</port_b>
      <port_c>texto</port_c>
      <port_d>Texto ..e</port_d>
      <port_e>texto </port_e>
      <Respondido>0</Respondido>

    ...

     

    Tentei atualizar um campo do arquivo da seguinte maneira :

      XDocument xDocument = XDocument.Load("App_Data/Quest.xml");

                var items = from item in xDocument.Descendants("p")
                            where item.Element("id").Value == "'"+id+"'"
                            select item;

                foreach (XElement itemElement in items)
                {
                    itemElement.SetElementValue("Respondido", "1");
                }

    O código não gera erro na hora da compilação, mas não atualiza o arquivo, alguem saberia me dizer o motivo?

    terça-feira, 20 de dezembro de 2011 14:16

Respostas

  • Oi Leandro, 

    O código entra no if certinho? 

    Segue um código que eu sei que esta funcionando..

                string sOrderType = "";
                XmlNodeList noE2EDP01008GRP; //itens produto
                noE2EDP01008GRP = xIdoc.SelectNodes("//ns0:Receive/ns0:idocData/ns1:E2EDP01008GRP", nsMgr);
    
                for (int i = 1; i < noE2EDP01008GRP.Count + 1; i++)
                {
                    XmlNodeList noE2EDP01008;
                    noE2EDP01008 = xIdoc.SelectNodes("//ns0:Receive/ns0:idocData/ns1:E2EDP01008GRP[" + i.ToString() + "]/ns1:E2EDP01008", nsMgr);
                                                                                          
    
                    if (noE2EDP01008[0].ChildNodes[3].InnerText != "9") //PSTYP se for 9 o produto é serviço
                        sOrderType = "Order";
                    else
                    {
                        sOrderType = "SupplyOrServiceOrder";
                        break;
                    }
                }
    
                xMsg.SelectSingleNode(sOrderTypeCoded).InnerText = sOrderType; //OrderTypeCoded
    
    


    Na hora de setar usa o xDocument.SelectSingleNode(Expressao xpath).InnerText = "valor";

    Voce esta apontando para o xmlnode tem q apontar para o xmlDocument


    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende
    • Marcado como Resposta leandro Bertanha quinta-feira, 22 de dezembro de 2011 13:42
    terça-feira, 20 de dezembro de 2011 23:47

Todas as Respostas

  • Oi Leandro, tenta usar as classes XmlNode, e XmlNodeList

    Aqui neste link vc vai encontrar um exemplo de como usar o XmlNode e XmlNodeList http://social.msdn.microsoft.com/Forums/pt-BR/xmlpt/thread/04fa393a-0a0a-4233-8f05-1d65273cb1a2

    Para setar o valor precisa criar o XmlNode e usar a sintaxe: XmlNode.InnerText = "Valor";


     


    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende
    terça-feira, 20 de dezembro de 2011 18:58
  • Remontei da seguinte maneira :

     


                XmlDocument xDocument = new XmlDocument();
                xDocument.Load("App_Data/Quest.xml");

                XmlNodeList quest = xDocument.SelectNodes("/q/p");

                //XmlNode root = xDocument.DocumentElement;

                foreach (XmlNode q in quest)
                {
                    if (q.SelectSingleNode("/q/p/id").InnerText == "'"+id+"'")
                    {
                        q["/q/p/Respondido"].InnerText = "1";
                    }
                }
                xDocument.Save("App_Data/Quest.xml");

     

     

    Novamente o comando executa sem erro mas nada acontece, o xml não altera.
    terça-feira, 20 de dezembro de 2011 22:34
  • Oi Leandro, 

    O código entra no if certinho? 

    Segue um código que eu sei que esta funcionando..

                string sOrderType = "";
                XmlNodeList noE2EDP01008GRP; //itens produto
                noE2EDP01008GRP = xIdoc.SelectNodes("//ns0:Receive/ns0:idocData/ns1:E2EDP01008GRP", nsMgr);
    
                for (int i = 1; i < noE2EDP01008GRP.Count + 1; i++)
                {
                    XmlNodeList noE2EDP01008;
                    noE2EDP01008 = xIdoc.SelectNodes("//ns0:Receive/ns0:idocData/ns1:E2EDP01008GRP[" + i.ToString() + "]/ns1:E2EDP01008", nsMgr);
                                                                                          
    
                    if (noE2EDP01008[0].ChildNodes[3].InnerText != "9") //PSTYP se for 9 o produto é serviço
                        sOrderType = "Order";
                    else
                    {
                        sOrderType = "SupplyOrServiceOrder";
                        break;
                    }
                }
    
                xMsg.SelectSingleNode(sOrderTypeCoded).InnerText = sOrderType; //OrderTypeCoded
    
    


    Na hora de setar usa o xDocument.SelectSingleNode(Expressao xpath).InnerText = "valor";

    Voce esta apontando para o xmlnode tem q apontar para o xmlDocument


    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende
    • Marcado como Resposta leandro Bertanha quinta-feira, 22 de dezembro de 2011 13:42
    terça-feira, 20 de dezembro de 2011 23:47
  • Ola Ruth

     

    Estou quase conseguindo, minha duvida agora esta no ajuste do xpath no campo:

     xDocument.SelectSingleNode("xpath").InnerText = "1";

    Como devo fazer o ajuste aqui?

     

    XmlDocument xDocument = new XmlDocume

    nt();
                xDocument.Load("App_Data/Quest.xml");

                string sOrderType = "";
                XmlNodeList oq; //itens produto
                oq = xDocument.SelectNodes("//q/p");

                for (int i = 1; i < oq.Count + 1; i++)
                {
                    XmlNodeList no;
                  no = xDocument.SelectNodes("//q/p[" + i.ToString() + "]");

                  
                    if (no[0].ChildNodes[6].InnerText != "'"+id.ToString()+"'")
                    {

                    no[0].ChildNodes[8].InnerText = "1";
             
                 
                    }
                }

    // o erro esta aqui

                //xDocument.SelectSingleNode("//q/p/Respondido").InnerText = "valor";

                xDocument.Save("App_Data/Quest.xml");

    quarta-feira, 21 de dezembro de 2011 13:49
  • http://support.microsoft.com/kb/311566
    One word frees us of all the weight and pain of life: that word is love.
    quinta-feira, 22 de dezembro de 2011 06:58
    Moderador
  • Consegui pessoal, abrigado a todos

     

    Código: 

     

    XmlDocument xDocument = new XmlDocument();
                xDocument.Load("App_Data/Quest.xml");

                string sOrderType = "";
                XmlNodeList oq; //itens produto
                oq = xDocument.SelectNodes("//q/p");

                for (int i = 1; i < oq.Count + 1; i++)
                {
                    XmlNodeList no;
                  no = xDocument.SelectNodes("//q/p[" + i.ToString() + "]");

            
                    if (int.Parse(no[0].ChildNodes[0].InnerText.ToString()) == id)
                 {
                    
                     xDocument.SelectSingleNode("//q/p[" + i.ToString() + "]/Respondido").InnerText = "1";

                   
                      
                  }
              }

            
                xDocument.Save("App_Data/Quest.xml");

    quinta-feira, 22 de dezembro de 2011 13:42