Usuário com melhor resposta
Tratamento de XML

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?
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
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>
-
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>
-
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
-
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
-
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 é.