Parsear xml com URL!

27 respostas
phillip.tessuto

Pessoal,

Bom dia…
Então vamos ver se vocês podem me ajudar.
Quando vou parsear um documento que está em xml, que veio através de uma URL, falla que dá um erro de espaço em branco…
Como consigo localizar este espaço em branco para correção ???!!!

Fico no aguardo…
Abs,

27 Respostas

Andre_Fonseca

oi,

o que você está usando para fazer o parser? pode colocar o código?

abs

phillip.tessuto

Bom dia meu amigo…

Bom, para isto estou a utilizar a classe XStream, que parseia linha à linha para mim…
Porém, como este relatório está vem com diversos caracters especiais, não consigo abrí-lo no meu editor de texto para localizar qual o motivo deste erro!!!

Como poderia abrir este arquivo, para verificar o problema??!!

Abs,

Andre_Fonseca

phillip.tessuto:
Bom dia meu amigo…

Bom, para isto estou a utilizar a classe XStream, que parseia linha à linha para mim…
Porém, como este relatório está vem com diversos caracters especiais, não consigo abrí-lo no meu editor de texto para localizar qual o motivo deste erro!!!

Como poderia abrir este arquivo, para verificar o problema??!!

Abs,

oi, bom dia

você já viu se existe alguma linha em branco no arquivo? isso pode ocasionar o erro

eu uso como editor de XML o xml spy, tem uma licensa trial de 30 dias, ele é muito bom

ele te permite criar um xsd (schema) para validar o xml, ai você abre ele no editor de textos e ele te mostra a linha onde está ocorrendo o erro

http://www.altova.com/simpledownload2c.html?gclid=CKvxwue3hKQCFUxb2godayxVHQ

phillip.tessuto

Então meu problema é que este arquivo foi salvo em meu tmp…
Só que seus caracters são extramamente estranhos.
Dai, não consigo abrílo em em meu editor de texto…
Estes caracteres vindos, são normais ??!!
Tem alguma forma de eu transformá-los em caracters normais ??!!

Valeu…

Abs,

Andre_Fonseca

é provavel que seja problema no encoding do arquivo

existe uma linha no topo dele parecida com isso?

você esta usando o que para abrir o arquivo?

phillip.tessuto

Estou utilizando o editor de texto do ubuntu…

Mas com ele não consigo abrir este arquivo…

Existe alguma outra maneira ??!!

Abs,

Andre_Fonseca

tente

phillip.tessuto

Então,

Consegui abrir pela URL que é me fornecido…

Agora, quando estou parseando, fala que existe espaço em branco.
Bom, realmente visualizei este espaço, que está entre o cabeçalho…<?xml version “1.0” enconding “UTF-8”>…Daí pula-se uma linha(quebra de linha), e começa minhas outras tags…
Este é o problema que está ocorrendo em seu parseamento…
Será que há alguma forma para fazer esta correção ??!!

desculpa a demora…

Abs,

Andre_Fonseca

oi,

faz o seguinte, cola xml que você está usando ai como anexo e eu vejo ele aqui

abs

hypeGuy

André,

Obrigado pela dica do XML Spy, acabou me ajudando a resolver este meu tópico

phillip.tessuto

André,

Tenho que parsear este xml que está em anexo…
O problema é que quando vou fazer a leitura dele para parsear ocorre este erro :

[color=red]only white space content allowed before start tag and not P (position: START_DOCUMENT seen P… @1:1)[/color]

Quando vou gravar no meu tmp, ele grava tudo com caracters diferentes…

Vc tem alguma idéia do que seria este erro ??!!

Abs,

phillip.tessuto

André,

Meu método que vai gravar, a partir da URL o XML, e está gravando com caracters estranhos está assim :

private String downloadReport(String urlReport, String name) throws RobotException {

String caminho = /tmp/ + name + .xml;

try {

URL url = new URL(urlReport);

URLConnection connection = url.openConnection();

connection.connect();

PrintStream saida = new PrintStream(caminho);

InputStreamReader isr = new InputStreamReader(connection.getInputStream());

BufferedReader br = new BufferedReader(isr);

String s = br.readLine();

l.info("Escrevendo relatorio do Yahoo: " + caminho);

while (s != null) {

saida.println(s);

s = br.readLine();

}

l.info(Arquivo escrito com sucesso!);

} catch (Exception e) {

String message = Erro ao gravar report!;

l.fatal(message);

throw new RobotException(message, e);

}

return caminho;

}

Está certo estes caracteres serem gravados desta maneira ??!!

Abs,

Andre_Fonseca

oi,

por acaso você está usando o método toXML do Xstream para gerar o xml a partir de seus objetos java?

caso seja isso talvez o tópico abaixo ajude

http://www.guj.com.br/posts/list/84829.java

abs

phillip.tessuto

Bom dia André,

Meu problema está na hora de gravar meu relatório em um arquivo!!!
Veja, como etes caracteres etão por vir :
PK

Isto é normal ??!!
Não sei como estão vindo desta maneira…
Aquela classe que indexei diz respeito a esta gravação…

Quando vou parsear, de forma alguma a um entendimento dos caracteres!!!

Veja se você me compreendeu…

Aguardo uma resposta…

Abs,

Andre_Fonseca

phillip.tessuto:
Bom dia André,

Meu problema está na hora de gravar meu relatório em um arquivo!!!
Veja, como etes caracteres etão por vir :
PK

Isto é normal ??!!
Não sei como estão vindo desta maneira…
Aquela classe que indexei diz respeito a esta gravação…

Quando vou parsear, de forma alguma a um entendimento dos caracteres!!!

Veja se você me compreendeu…

Aguardo uma resposta…

Abs,

oi, bom dia

este código que você passou está lendo o XML de uma pasta temporária e salvando em outra pasta certo?
o erro que acontece não é relacionado a isso, mas sim ao parser do XML

parsear um XML significa abrir ele e percorrer os atributos/nodes

eu usei o mesmo XML que você passou e consegui usar o mesmo código que você passou salvando em outra pasta sem problemas

este problema dos caracteres tem a ver com o encoding na hora da geração do XML

como está sendo gerado este XML? você sabe como foi feito o código?

abs

phillip.tessuto

André,

Na verdade pego, através de uma URL, o .xml passado à você.
Até aí tudo bem…
Realmente consigo ler este .xml e gravar no tmp.
Se vc está falando que este problema de enconding não é o problema em relação ao parser…o que que pode ser !!!

Bom, a príncípio este é o método que pega direto da URL e gera em meu tmp…este método, pelo que sei, está correto…

Dê uma olhada :

private String downloadReport(String urlReport, String name) throws RobotException {

String caminho = /tmp/ + name + .xml;

try {

URL url = new URL(urlReport);

URLConnection connection = url.openConnection();

connection.connect();

PrintStream saida = new PrintStream(caminho);

InputStreamReader isr = new InputStreamReader(connection.getInputStream());

BufferedReader br = new BufferedReader(isr);

String s = br.readLine();

l.info("Escrevendo relatorio do Yahoo: " + caminho);

while (s != null) {

saida.println(s);

System.out.println(s);

s = br.readLine();

}

l.info(Arquivo escrito com sucesso!);

} catch (Exception e) {

String message = Erro ao gravar report!;

l.fatal(message);

throw new RobotException(message, e);

}

return caminho;

}

O problema é que ele gera com este problema de enconding…
O que poderia ser??!!
Será que isto não prejudica na hora de fazer o parseamento…Isto porque vou fazer o parser direto deste arquivo…
Ele conseguiria entender estes caracteres ??!!
Esta é minha dúvida…

Abs,

phillip.tessuto

André,

Na verdade meu grande problema encontra-se aqui :

private Report parseReportXML(String xmlPath) throws RobotException {

XStream xstream = new XStream();
xstream.addImplicitCollection(Report.class, "rows");

	xstream.alias("report", Report.class);
	xstream.alias("row", Row.class);
	xstream.alias("totals", Totals.class);
	xstream.alias("filter", Filter.class);
	xstream.alias("analytics", Analytics.class);
	xstream.omitField(Report.class, "sort");
	xstream.useAttributeFor(Report.class, "name");
	xstream.useAttributeFor(Report.class, "masterAccountID");
	xstream.useAttributeFor(Report.class, "masterAccountName");
	xstream.useAttributeFor(Report.class, "dateStart");
	xstream.useAttributeFor(Report.class, "dateEnd");
	xstream.useAttributeFor(Report.class, "booksClosedTimestamp");
	xstream.useAttributeFor(Report.class, "booksClosed");
	xstream.useAttributeFor(Report.class, "createDate");
	xstream.useAttributeFor(Report.class, "sortColumn");
	xstream.useAttributeFor(Report.class, "sortOrder");

	xstream.useAttributeFor(Row.class, "cmpgnID");
	xstream.useAttributeFor(Row.class, "adGrpID");
	xstream.useAttributeFor(Row.class, "keywordID");
	xstream.useAttributeFor(Row.class, "urlID");
	xstream.useAttributeFor(Row.class, "accountName");
	xstream.useAttributeFor(Row.class, "accountID");
	xstream.useAttributeFor(Row.class, "cmpgnName");
	xstream.useAttributeFor(Row.class, "adGrpName");
	xstream.useAttributeFor(Row.class, "keywordName");
	xstream.useAttributeFor(Row.class, "url");

// xstream.useAttributeFor(Row.class, “tacticID”);

xstream.useAttributeFor(Analytics.class, "numImpr");
	xstream.useAttributeFor(Analytics.class, "numClick");
	xstream.useAttributeFor(Analytics.class, "ctr");
	xstream.useAttributeFor(Analytics.class, "cpc");
	xstream.useAttributeFor(Analytics.class, "cost");
	xstream.useAttributeFor(Analytics.class, "averagePosition");

	xstream.useAttributeFor(Filter.class, "columnName");
	xstream.useAttributeFor(Filter.class, "operator");
	xstream.useAttributeFor(Filter.class, "value");

	Report report = new Report();
	try {
		[color=red]report = (Report) xstream.fromXML(new FileInputStream(xmlPath));[/color]
	} catch (FileNotFoundException e) {
		String message = "Arquivo de XML não encontrado!";
		l.fatal(message);
		throw new RobotException(message, e);
	}

	return report;
}

Será que você consehue me dar uma explicação …

Abs,

Andre_Fonseca

oi,

agora sim estamos chegando perto, o erro acontece quando ele tenta ler o xml e criar o objeto Report certo?

qual o valor (dentro deste método) da variável xmlPath?

ele está lançando alguma excessão neste método?

já tentou debugar apenas este método?

tente criar um teste unitário para ele você sabe como fazer??

abs

phillip.tessuto

Então André,

Realmente o único problema está neste arquivo .xml que é gerado com carcteres especiais…
Fiz um teste pegando aquele xml que lhe passei e salvando ele direto no meu tmp.
Daí fui fazer um parser dele…
Tudo ocorreu perfeitamente!!!
Então meu problema está na criação deste arquivo lendo ele pela URL e salvando no meu tmp…
Esta String xmlPath é somente o caminho dele…
Mas quando fazer sua leitura não interpreta aqueles caracteres…
Vou postar aqui o relatório gerado.
Criei um novo método para que ele fizesse a leitura e gravasse no tmp…
Mas mesmo assim o mesmo erro persistiu…
O que que pode ser que acontece isto ??!!
Sei que é em relação ao enconding…
Mas para mim, o método está perfeito!!!

private String downloadReport(String urlReport, String name) throws RobotException {

String caminho = /tmp/ + name + .xml;

try {

URL url = new URL(urlReport);

URLConnection connection = url.openConnection();

connection.connect();

copy(connection.getInputStream(), caminho);

l.info(Arquivo escrito com sucesso!);

} catch (Exception e) {

String message = Erro ao gravar report!;

l.fatal(message);

throw new RobotException(message, e);

}

return caminho;

}
private void copy(InputStream in, String to) throws IOException {

OutputStream out = null;

try {

out = new FileOutputStream(to);

final int BUFF_SIZE = 100000;

final byte[] buffer = new byte[BUFF_SIZE];

while (true) {

synchronized (buffer) {

int amountRead = in.read(buffer);

if (amountRead == -1) {

break;

}

out.write(buffer, 0, amountRead);

}

}

} finally {

if (in != null) {

in.close();

}

if (out != null) {

out.close();

}

}

}
phillip.tessuto

André,

Será que me expressei bem ??!!
Não sei mais o que fazer!!!
Me dê uma ajuda, por favor…

Abs,

Andre_Fonseca

oi,

tente adaptar o código do link para gerar o XML e veja como fica

abs

phillip.tessuto

Bom dia André,

Então, é por aí…
Preciso fazer com que na hora de eu gerar meu .xml, entenda que sua codificação tem de ser interpretada em UTF-8 !!!
Pelo que entendi está entendendo que é uma outra codificação…
Vou dar uma olhada se encontro algo referente a isto, mas se você puder me dar uma ajuda à mais…
Bom fico aguardando…

Valeu, cara…
Abs,

Andre_Fonseca

oi, bom dia

tente usar o código que está no link que te passei

public class FibonacciFile {

	public static void main(String[] args) {

		BigInteger low = BigInteger.ONE;
		BigInteger high = BigInteger.ONE;

		try {
			OutputStream fout = new FileOutputStream(&quot;fibonacci.xml&quot;);
			OutputStream bout = new BufferedOutputStream(fout);
			OutputStreamWriter out = new OutputStreamWriter(bout, &quot;8859_1&quot;);

			out.write(&quot;&lt;?xml version=\&quot;1.0\&quot; &quot;);
			out.write(&quot;encoding=\&quot;ISO-8859-1\&quot;?&gt;\r\n&quot;);
			out.write(&quot;&lt;Fibonacci_Numbers&gt;\r\n&quot;);
			for (int i = 1; i &lt;= 10; i++) {
				out.write(&quot;  &lt;fibonacci index=\"" + i + "\"&gt;");
				out.write(low.toString());
				out.write("&lt;/fibonacci&gt;\r\n");
				BigInteger temp = high;
				high = high.add(low);
				low = temp;
			}
			out.write("&lt;/Fibonacci_Numbers&gt;\r\n");

			out.flush(); // Don't forget to flush!
			out.close();
		} catch (UnsupportedEncodingException e) {
			System.out
					.println("This VM does not support the Latin-1 character set.");
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}

	}

}
phillip.tessuto

Cara,

Ainda não consegui…

Com este método, consigo ler todos os xml…
Passo uma URL como exempĺo já posta no lugar certo:

private String downloadReport(String urlReport, String name) throws RobotException {

String caminho = /tmp/ + name + .xml; //caminho onde irei gravar na sequencia deste código meu xml

try {

URL url = new URL("[color=green]<a href="http://www.allbags.com.br/BuscaPe/busca.xml%5B/color%5D">http://www.allbags.com.br/BuscaPe/busca.xml[/color]</a>");

BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));

String linha = “”;

while ((linha = reader.readLine()) != null) {

System.out.println(linha);

}

reader.close();

}

Bleza…
Agora, quando quero inserir esta outra URL para leitura, https://ews21.marketing.ews.yahooapis.com:443/report/V6/ReportOutput?t=ElSIdUhsH9BbvD9EUIV1b1djIeiJFKJ45kwz5jkcosM4ysQAjbRTz3_CKWtsf9.os4.fxHXx9bhxggG.MdISOmlZHDinDUaHMVHG
NÃO ROLA !!!

Não consegui fazer com que utilizando aquela implementação desse certo…
Será que você consegue me dar uma ajuda ??!!

Valeu…
Abs,

phillip.tessuto

Amigo,

Na verdade agora que pude ver que tenho de desempacotar este .zip, e ler seu xml…
Desempacotando, consegui ler normalmente…

Será que você sabe como faço para desempacotar este .zip, para ele poder ler o arquivo certo ??!!

Agradeço novamente,
Abs…

Andre_Fonseca

oi,

desculpe, não entendi onde entra esse arquivo zipado ai..rs

de qualquer forma para fazer o unzip pode usar o código abaixo

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class MainClass {

  public static void main(String[] args) throws IOException {
    ZipFile zf = new ZipFile(args[0]);
    Enumeration e = zf.entries();
    while (e.hasMoreElements()) {
      ZipEntry ze = (ZipEntry) e.nextElement();
      System.out.println("Unzipping " + ze.getName());
      FileOutputStream fout = new FileOutputStream(ze.getName());
      InputStream in = zf.getInputStream(ze);
      for (int c = in.read(); c != -1; c = in.read()) {
        fout.write(c);
      }
      in.close();
      fout.close();
    }
  }
}
phillip.tessuto

Bom dia André,

Fico muito agradecido por sua atenção…
Ontem fiquei aqui no trampo até mais tarde, e fui descobrir que por padrão, na API do Yahoo, este relatório zippado…
Desta maneira, consegui deixar o arquivo no formato unzipp.
Agora me parece que já consigo reconhecer o XML, fazer sua leitura e gravação…

Agora, terei de dar continuidade no serviço…

Qualquer coisa voltamos a nos falar, pode ser ??!!

Fico mesmo agradecido…

Valeu e abs…

Criado 13 de setembro de 2010
Ultima resposta 16 de set. de 2010
Respostas 27
Participantes 3