Olá a todos!
Estou precisando ler uma String onde seu conteúdo é no formato de um arquivo XML e me é enviada via Socket.
O que eu precisaria fazer é:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("meuArquivo.xml");
Porém, não existe um arquivo XML físico, apenas uma String com seu conteúdo.
Vendo a API, percebi que o parâmetro do método parse pode ser um InputStream, um InputSource ou um File.
A minha dúvida está justamente em como transformar essa String que estou recebendo em um desses 3 objetos.
Obrigado desde já.
Abraços.
tnaires
Novembro 6, 2008, 4:38pm
#2
É enviado via socket? Então passar como parâmetro para o método parse uma chamada a socket.getInputStream() não adianta?
Hhmm… vou testar aqui e já já aviso.
É… funcionou nao… :?
Executo o seguinte trecho
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer stringBuffer = new StringBuffer();
char[] buffer = new char[64 * 1024];
int length = bufferedReader.read(buffer);
while (length != -1) {
stringBuffer.append(buffer, 0, length);
length = bufferedReader.read(buffer);
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
@SuppressWarnings("unused")
Document document = builder.parse(socket.getInputStream());
callback.receive(stringBuffer.toString());
} catch (Exception e) {
callback.reportException(e);
}
}
e recebo a seguinte mensagem na linha do parse:
[Fatal Error] :-1:-1: Premature end of file.
tnaires
Novembro 6, 2008, 5:20pm
#5
Não, não
Você não pode chamar o getInputStream() duas vezes. Tente isso:
[code]public void run() {
try {
// Aqui estão todos os dados que estão chegando via socket.
InputStream is = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
StringBuffer stringBuffer = new StringBuffer();
char[] buffer = new char[64 * 1024];
int length = bufferedReader.read(buffer);
while (length != -1) {
stringBuffer.append(buffer, 0, length);
length = bufferedReader.read(buffer);
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
@SuppressWarnings("unused")
Document document = builder.parse(is);
callback.receive(stringBuffer.toString());
} catch (Exception e) {
callback.reportException(e);
}
}[/code]
Veja se você ainda precisa transformar tudo pra String. Caso não precise, seu código pode ficar simplesmente assim:
[code]public void run() {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
@SuppressWarnings("unused")
Document document = builder.parse(socket.getInputStream());
} catch (Exception e) {
callback.reportException(e);
}
}[/code]
Abraços