Problemas com ClientOM.File.OpenBinaryDirect "cortando" xml, e agora?

Respondido Problemas com ClientOM.File.OpenBinaryDirect "cortando" xml, e agora?

  • quarta-feira, 18 de julho de 2012 16:59
     
     

    Olá,
    Tenho uma aplicação console que acessa os itens da minha biblioteca infopath.

    A aplicação le os itens da biblioteca e os atualiza.
    Para atualizar o arquivo infopath (xml) o sistema precisa pegá-lo/obtê-lo (xml).
    Para isso ele faz:

    FileInformation ofile = ClientOM.File.OpenBinaryDirect(ClientContext, (string)oitem["FileRef"]);
    System.Xml.XmlTextReader oXmlTxtReader = new XmlTextReader(ofile.Stream);
    System.Xml.Serialization.XmlSerializer oSerializer = new System.Xml.Serialization.XmlSerializer(typeof(XmlDocument));
    XmlDocument Form = (XmlDocument)oSerializer.Deserialize(oXmlTxtReader);


    Quando abro o arquivo infopath Form(XMLDOcument) vejo que as primeiras linhas do mesmo não existem.
    Alguém conhece uma outra forma para obter o xml?

    Obrigado


    k2rto4-Pb - Analista SharePoint


    • Editado k2rto'4 terça-feira, 24 de julho de 2012 12:07
    •  

Todas as Respostas

  • quarta-feira, 18 de julho de 2012 18:18
     
     

    k2rto4-Pb,

    Por que você não publica os campos necessários do infopath na biblioteca? Assim seria mais facil a atualização.


    Atenciosamente, Rafael Fausto

  • quarta-feira, 18 de julho de 2012 18:42
     
      Contém Código

    Tente o seguinte:

    string output = string.Empty;
    
    
    FileInformation ofile = ClientOM.File.OpenBinaryDirect(ClientContext, (string)oitem["FileRef"]);
    XmlTextReader reader = new XmlTextReader(ofile.Stream);
    reader.WhitespaceHandling = WhitespaceHandling.None;
    
    string node = string.Empty;
    
    
    while(reader.Read())
    {
    
    if(!string.IsNullOrEmpty(reader.Value))
    {
    
    switch(node)
    {
    case "my:txtNome":
    case "my:txtEndereco":
    	output = string.Concat(output, node.Length > 3 ? node.Substring(3) : node, "=", reader.Value, ",\n");
    	break;
    }
    }
    node = reader.Name;
    }

    Ou você pode utilizar um XPath se o seu Xml for muito complexo.


    ROBERTOSLJUNIOR


  • quarta-feira, 18 de julho de 2012 19:15
     
     

    Olá Roberto,

    Fiz aqui o que voce me passou mas nao deu certo.

    As linhas iniciais ainda não existem no documento.

    É como que se o ClientOM.File.OpenBinaryDirect(ClientContext, (string)oitem["FileRef"]) não trouxesse elas.

    E agora?

    Obrigado


    • Editado k2rto'4 quarta-feira, 18 de julho de 2012 19:32
    •  
  • quarta-feira, 18 de julho de 2012 19:52
     
      Contém Código
    Oi, tente o seguinte:
    XmlDocument doc = new XmlDocument();
    
    doc.Load(reader);
    
    reader.Close();
    
    stream.Close();
    
    XmlNameSpaceManager ns = new XmlNameSpaceManager(doc.NameTable);
    
    ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-06-11T12:44:57");
    
    doc.DocumentElement.SelectSingleNode("my:txtNome", ns).InnerText = "Roberto";
    
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    
    SPFile oSPFile = oWeb.Folders["BIBLIOTECA"].Files.Add(item.File.Name.ToString(), (encoding.GetBytes(doc.OuterXml)), true);
    
    item.File.Update();
    

    Se possível utilize XmlReader, eu estava vendo a documentação e XmlTextReader não é mais utilizado.

    Abraço


    ROBERTOSLJUNIOR

  • quarta-feira, 18 de julho de 2012 20:16
     
     

    Olá Roberto,

    O reader ja esta errado.

    No seu exemplo anterior:

    FileInformation ofile = ClientOM.File.OpenBinaryDirect(ClientContext, (string)oitem["FileRef"]);
    XmlTextReader reader = new XmlTextReader(ofile.Stream);
    reader
    .WhitespaceHandling = WhitespaceHandling.None;

    Ele já esta incompleto.

    Seria isso mesmo?

    Abraços


    k2rto4-Pb - Analista SharePoint

  • quarta-feira, 18 de julho de 2012 20:33
     
     

    Tente

    string fileurl = (string)item["FileRef"];

    E veja se retorna algo.

  • quarta-feira, 18 de julho de 2012 20:38
     
     

    Olá,

    Desta forma em vez de ser retornado o "/meusubsite/minhabiblioteca/052145-2010.xml" é retornado apenas 052145-2010.xml.
    E assim o seguinte erro é mostrado:

    Specified argument was out of the range of valid values.
    Parameter name: serverRelativeUrl

    Obrigado


    k2rto4-Pb - Analista SharePoint

  • quarta-feira, 18 de julho de 2012 20:41
     
     

    Mudei a resposta.

    Veja


    ROBERTOSLJUNIOR

  • quarta-feira, 18 de julho de 2012 20:47
     
     

    Olá,

    O retorno de string fileurl = (string)item["FileRef"] é "/meusubsite/minhabiblioteca/052145-2010.xml.

    Abs


    k2rto4-Pb - Analista SharePoint

  • quarta-feira, 18 de julho de 2012 20:55
     
     

    Você já tentou com outro xml?

    Pode passar o xml?


    ROBERTOSLJUNIOR

    • Marcado como Resposta k2rto'4 quarta-feira, 18 de julho de 2012 22:07
    • Não Marcado como Resposta k2rto'4 segunda-feira, 23 de julho de 2012 18:29
    •  
  • quarta-feira, 18 de julho de 2012 21:09
     
     

    Olá Roberto,
    Ja tentei com vários.

    Acabei de fazer um teste aqui com um xml completo.
    Depois que o mesmo passa pela rotina abaixo ele perde as 4 primeiras linhas do xml.

    FileInformation ofile = ClientOM.File.OpenBinaryDirect(ClientContext, (string)oitem["FileRef"]);
    System.Xml.XmlTextReader oXmlTxtReader = new XmlTextReader(ofile.Stream);
    System.Xml.Serialization.XmlSerializer oSerializer = new System.Xml.Serialization.XmlSerializer(typeof(XmlDocument));
    XmlDocument Form = (XmlDocument)oSerializer.Deserialize(oXmlTxtReader);


    Abs


    k2rto4-Pb - Analista SharePoint

  • quarta-feira, 18 de julho de 2012 22:07
     
     Respondido

    Olá Roberto,

    Consegui resolver aqui de uma forma, mas talvez existam outras.
    Segue solução:

    O que fiz foi:

    Criar um novo XMLDocument.
    Neste novo XML Document eu adicionei os ChildNodes que faltava

    Então lí e copiei o childNode do arquivo Original para um novo XmlNode.

    Por fim adicionei o XmlNode copiado ao novo XMLDocument gerado.
    Com isso tenho o meu XMLDocument completo da forma como deveria ser.

    Em breve posto solução.

    Att,

    Muito Obrigado.
    Conseguimos!!!!!!!

    Abs


    k2rto4-Pb - Analista SharePoint

    • Marcado como Resposta k2rto'4 segunda-feira, 23 de julho de 2012 18:29
    •  
  • segunda-feira, 23 de julho de 2012 18:28
     
     Respondido

    Olá Rafael e Roberto,

    Consegui obter o xml original do item.

    Consegui por acaso lendo este outro post.

    http://social.msdn.microsoft.com/Forums/pt-BR/sharepointpt/thread/9ab7061d-ea80-403a-8469-07047221774e

    Aqui o Rafael Fausto passou um link onde eu consegui obter a resposta.

    Agora consigo pegar o xml direto.

    Para isso basta:

    ....Dentro do Foreach.....

    FileInformation ofile = ClientOM.File.OpenBinaryDirect(ClientContext, (string)oitem["FileRef"]);
    XmlDocument XmlOriginalInfoPath = new XmlDocument();
    XmlOriginalInfoPath.Load(ofile.Stream);

    Abraços


    k2rto4-Pb - Analista SharePoint

    • Marcado como Resposta k2rto'4 segunda-feira, 23 de julho de 2012 18:28
    •