none
Tratamento de XML RRS feed

  • Pergunta

  • Boa tarde,

    Estou com problema para tratar uma string com dados em XML. A string que recebo via TCP/IP contém N xml dentro dele. Após um certo quantidade de dados, o xml vem mais ou menos assim porém em grande quantidade (chega a ter mais de 50000 caracteres de um "espaço").

    "<TecnologiaIn



    tervalo>"


    Porém até achei que poderia ser espaço, tab, enter, onde coloquei as linhas de comando para retirar isso de uma string mais mesmo assim continua.

    palavratemp = palavras(subtotal).Replace(vbTab, "")

    palavratemp = palavras(subtotal).Replace(" ", "")

    palavratemp = palavras(subtotal).Replace("\n", "")

    Alguém saberia o que pode ser?

    sexta-feira, 17 de janeiro de 2014 18:20

Respostas

  • Bruno pode tentar assim:

                string strXml = @"
                    <EnvioTerceiro> 
                        <No1>1</N   o1>
                        <No2    >Teste</No2>
                    </EnvioTerceir o  >
                ";
    
                string novaStrXml = strXml;
                int ultimoIndiceAbreTag = 0;
                while (strXml.IndexOf("<", ultimoIndiceAbreTag) > -1)
                {
                    ultimoIndiceAbreTag = strXml.IndexOf("<", ultimoIndiceAbreTag);
                    int indiceFechaTag = strXml.IndexOf(">", ultimoIndiceAbreTag);
                    if (indiceFechaTag > ultimoIndiceAbreTag)
                    {
                        string strTag = strXml.Substring(ultimoIndiceAbreTag, (indiceFechaTag - ultimoIndiceAbreTag) + 1);
                        novaStrXml = novaStrXml.Replace(strTag, strTag.Replace(" ", ""));
                    }
    
                    ultimoIndiceAbreTag++;
                }
    
                System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
                xmlDoc.LoadXml(novaStrXml);
    
                MessageBox.Show(xmlDoc.InnerXml);

    Assim você irá substituir apenas os espaços das tags.

    Bruno se a resposta acima ajudou marca-la como resposta



    • Sugerido como Resposta Lucas D Santos terça-feira, 21 de janeiro de 2014 13:31
    • Editado Lucas D Santos sexta-feira, 24 de janeiro de 2014 10:16
    • Marcado como Resposta Giovani Cr segunda-feira, 27 de janeiro de 2014 18:21
    terça-feira, 21 de janeiro de 2014 13:24

Todas as Respostas

  • Bruno o XML vem da onde? De um banco de dados ou é enviado para você por um webservice por exemplo?

    O problema muito provavelmente está na passagem dos dados para sua aplicação pois uma string no .net pode conter até caractéres até 2<sup>31</sup>

    sexta-feira, 17 de janeiro de 2014 20:00
  • Bom dia Lucas,

    O xml vem de uma aplicação de terceiro. O que eu acho estranho é que por exemplo, venham 5 xmls dentro de uma unica string. Os 3 primeiros vem normalmente, porém a partir do 4 xml, o mesmo vem com esse "espaço". Vou tentar dar um exemplo melhor.

    Obs: Lembrando que esses "espaços" podem aparecer em qualquer lugar, não sendo somente após as tags.

    <xml....>

    <xml1>

    <no1>teste</no1>

    <no2>teste2</no2>

    </xml1>

    <xml2>

    <no1>teste</no1>

    <no2>teste2</no2>

    </xml2>

    <xml3>

    <no1>teste</no1>

    <no2>teste2</no2>

    </xml3>

    <xml4>

    <no1>teste                                                                                                         </no1>

    <no                                                                                                                     2>teste2 </no2>

    </xml4>

    </xml>

    segunda-feira, 20 de janeiro de 2014 13:26
  • Bom dia Lucas,

    O xml vem de uma aplicação de terceiro. O que eu acho estranho é que por exemplo, venham 5 xmls dentro de uma unica string. Os 3 primeiros vem normalmente, porém a partir do 4 xml, o mesmo vem com esse "espaço". Vou tentar dar um exemplo melhor.

    Obs: Lembrando que esses "espaços" podem aparecer em qualquer lugar, não sendo somente após as tags.

    <xml....>

    <xml1>

    <no1>teste</no1>

    <no2>teste2</no2>

    </xml1>

    <xml2>

    <no1>teste</no1>

    <no2>teste2</no2>

    </xml2>

    <xml3>

    <no1>teste</no1>

    <no2>teste2</no2>

    </xml3>

    <xml4>

    <no1>teste                                                                                                         </no1>

    <no                                                                                                                     2>teste2 </no2>

    </xml4>

    </xml>

    Olá bruno, você teria que tratar essa string inteira e antes de apagar qualquer caracter, precisa ter certeza que não vem texto literal no valor dos Nodes do XML - ou seja, se vier por exemplo "<no1>Oi gente</no1>" e você apagar todos os espaços da String você vai juntar o "Oi" com o "Gente". Então sugiro você buscar por espaços repetidos.

    Passando isso, precisamos saber se é espaço mesmo, ou TAB ou qualquer outra coisa - faça o seguinte - salve essa string em um arquivo qualquer e leia o arquivo usando BINARY. Leia a posição que você sabe que tem espaço como BYTE e compara com o código ASCII (tabela: http://pt.wikipedia.org/wiki/ASCII) - o TAB será 9, o espaço 32 e assim por diante.

    Se não for nada entre 32 e 126 você pode mandar apagar direto, em todo o conteúdo da String, a não ser que você precise de TAB dentro do valor (teria que saber o tipo de conteúdo para ter certeza).

    Veja o exemplo de como ler o byte (crie este código em um projeto de teste mesmo, só para você saber o caracter).

    Public Sub Read(ByVal FileName As String, ByVal BytePos as Long)
        Dim IO As Integer = Microsoft.VisualBasic.FreeFile()
        Microsoft.VisualBasic.FileOpen(IO, FileName, Microsoft.VisualBasic.OpenMode.Binary)
        Dim Collect As Byte = 0
        Microsoft.VisualBasic.FileGet(IO, Collect, BytePos)
        Microsoft.VisualBasic.FileClose(IO)
        System.Windows.Forms.MessageBox.Show(CStr(Collect))
    End Sub

    O "BytePos" é a posição que você vai ler, abra o arquivo antes (no Notepad ++ por exemplo - que te da a posição do cursor referente ao byte do arquivo) e veja onde você tem um espaço.

    Ai  quando você já souber isso use o String.Replace() do caracter por "".

    Isso é apenas uma ideia para você diagnosticar seu arquivo XML, mas se ele estiver em ordem, e for só para uso (se você estiver excluindo espaço apenas para salvar o arquivo em disco ou em um DB ocupando menos espaço) você pode carregar direto na classe System.XML.XMLDocument, apenas separando a os XMLs dentro da string... se tiver mais de um ai você precisará realmente quebrar o texto em várias strings e carregar em várias classes XML...

    De qualquer forma, espero ter ajudado.

    • Sugerido como Resposta SammuelMiranda terça-feira, 21 de janeiro de 2014 13:03
    terça-feira, 21 de janeiro de 2014 13:01
  • Bruno pode tentar assim:

                string strXml = @"
                    <EnvioTerceiro> 
                        <No1>1</N   o1>
                        <No2    >Teste</No2>
                    </EnvioTerceir o  >
                ";
    
                string novaStrXml = strXml;
                int ultimoIndiceAbreTag = 0;
                while (strXml.IndexOf("<", ultimoIndiceAbreTag) > -1)
                {
                    ultimoIndiceAbreTag = strXml.IndexOf("<", ultimoIndiceAbreTag);
                    int indiceFechaTag = strXml.IndexOf(">", ultimoIndiceAbreTag);
                    if (indiceFechaTag > ultimoIndiceAbreTag)
                    {
                        string strTag = strXml.Substring(ultimoIndiceAbreTag, (indiceFechaTag - ultimoIndiceAbreTag) + 1);
                        novaStrXml = novaStrXml.Replace(strTag, strTag.Replace(" ", ""));
                    }
    
                    ultimoIndiceAbreTag++;
                }
    
                System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
                xmlDoc.LoadXml(novaStrXml);
    
                MessageBox.Show(xmlDoc.InnerXml);

    Assim você irá substituir apenas os espaços das tags.

    Bruno se a resposta acima ajudou marca-la como resposta



    • Sugerido como Resposta Lucas D Santos terça-feira, 21 de janeiro de 2014 13:31
    • Editado Lucas D Santos sexta-feira, 24 de janeiro de 2014 10:16
    • Marcado como Resposta Giovani Cr segunda-feira, 27 de janeiro de 2014 18:21
    terça-feira, 21 de janeiro de 2014 13:24
  • Boa tarde,

    Peço desculpas pela demora em responder, acabei tendo alguns problemas aqui na empresa para resolver (na área de TI) e acabei dando uma pausa no desenvolvimento.

    Vou realizar o processo com os códigos que o pessoal sugeriu, e caso não de certo volto a colocar aqui. Muito obrigado a todos.

    Sobre o xml, o mesmo vem N dentro de 1, tendo que separar. Ex: Em uma vez vem 8, no próximo pode ver 5,5, ai no próximo vem 9,5 (completando o outro que veio pela metade).

    Quanto aos "espaços" também estou vendo com o pessoal que desenvolveu o sistema para ver o que é.

    terça-feira, 4 de fevereiro de 2014 14:05